5

我正在使用nedb,我正在尝试通过匹配它来更新现有记录ID,并更改title属性。发生的情况是创建了一个新记录,而旧记录仍然存在。我尝试了几种组合,并尝试使用谷歌搜索,但搜索结果很少。

var Datastore = require('nedb');
var db = {
    files: new Datastore({ filename: './db/files.db', autoload: true })
};

db.files.update(
  {_id: id}, 
  {$set: {title: title}}, 
  {}, 
  callback
);

执行删除时更疯狂的是,再次添加了一条新记录,但这一次记录有一个奇怪的属性: {"$$deleted":true,"_id":"WFZaMYRx51UzxBs7"}

这是我正在使用的代码:

db.files.remove({_id: id}, callback);

4

1 回答 1

12

在 nedb 文档中,它说以下内容:

localStorage 有大小限制,因此如果您的客户端应用程序需要大量更新和删除,最好每 2-5 分钟设置一次重复压缩以节省空间。有关NeDB 使用的仅附加格式的更多详细信息,请参阅数据库压缩。

 

压缩数据库

在底层,NeDB 的持久性使用仅追加格式,这意味着所有更新和删除实际上都会导致在数据文件末尾添加行。这样做的原因是磁盘空间非常便宜,并且附加比重写要快得多,因为它们不进行搜索。每次您的应用程序重新启动时,数据库都会自动压缩(即以每文档一行的格式放回)。

您可以使用不带参数的 yourDatabase.persistence.compactDatafile 手动调用压缩函数。它在执行程序中对数据文件的压缩进行排队,以便在所有未决操作之后按顺序执行。

您还可以使用 yourDatabase.persistence.setAutocompactionInterval(interval) 设置定期自动压缩,间隔以毫秒为单位(强制至少 5 秒),并使用 yourDatabase.persistence.stopAutocompaction() 停止自动压缩。

请记住,压缩需要一些时间(不要太多:在我的慢速机器上 50k 记录需要 130 毫秒)并且在它执行时不会发生其他操作,因此大多数项目实际上不需要使用它。

我没有使用它,但它似乎使用 localStorage 并且它具有用于更新和删除方法的仅附加格式。

在调查它的源代码时,在persistence.tests中的搜索中,他们想确保检查$$delete密钥,他们也提到了`如果文档包含$$deleted:true,这意味着我们需要从数据中删除它`。

所以,在我看来,你可以尝试手动压缩数据库,或者在你的问题中;第二种方法可能很有用。

于 2015-08-17T13:58:09.003 回答