Nedb方法update和delete创建一个新条目,而不是更新现有条目



我正在使用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);

在nedb文档中有如下说明:

localStorage有大小限制,所以设置它可能是个好主意重复压缩每2-5分钟,以节省空间,如果您的客户应用程序需要大量的更新和删除。请参阅数据库压缩关于NeDB使用的仅追加格式的更多细节。

压缩数据库

在底层,NeDB的持久性使用仅追加的格式,这意味着所有的更新和删除实际上都会在最后添加行数据文件的。这样做的原因是磁盘空间非常便宜追加比重写要快得多,因为它们不需要查找。数据库被自动压缩(即放回

可以手动调用压缩函数compactdatafile不带参数。它将要执行的数据文件的压缩列在执行器中

还可以设置定期自动压缩yourDatabase.persistence.setAutocompactionInterval(间隔),间隔以毫秒为单位(强制要求至少5s),并自动停止

使用yourDatabase.persistence.stopAutocompaction()。

请记住,压缩需要一些时间(不要太多:130ms)对于50k条记录(在我缓慢的机器上),没有其他操作可以发生因此,大多数项目实际上不需要使用它。

我没有使用这个,但它似乎,它使用localStorage和它有附加格式的更新和删除方法。

在调查其源代码时,在持久化中搜索。测试他们想要确保检查$$delete键,他们也提到了'如果一个文档包含$$deleted: true,这意味着我们需要从数据中删除它' '。

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

最新更新