nedb方法更新和删除会创建一个新条目,而不是更新现有条目

时间:2015-08-16 18:49:48

标签: javascript node.js nw.js express-4 nedb

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

1 个答案:

答案 0 :(得分:9)

在nedb文档中,它说:

  

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

  

压缩数据库

     

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

     

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

     

您也可以定期设置自动压缩   yourDatabase.persistence.setAutocompactionInterval(interval),interval   以毫秒为单位(强制执行最少5秒),并自动停止   用yourDatabase.persistence.stopAutocompaction()压缩。

     

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

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

在persistence.tests中调查其源代码in that search时,他们希望确保检查$$delete密钥,他们也提到了`如果某个文档包含$$已删除:true,则表示我们需要删除它来自数据``。

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