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

我正在使用nedb ,我试图通过匹配它的ID更改现有的logging,并更改title属性。 发生的是一个新的logging被创build,而旧的logging仍然存在。 我尝试了几种组合,并试着用Googlesearch,但search结果很less。

 var Datastore = require('nedb'); var db = { files: new Datastore({ filename: './db/files.db', autoload: true }) }; db.files.update( {_id: id}, {$set: {title: title}}, {}, callback ); 

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

这是我正在使用的代码:

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

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

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

压缩数据库

在这种情况下,NeDB的持久性使用append-only格式,这意味着所有的更新和删除实际上都会在数据文件末尾添加行。 原因是磁盘空间非常便宜,并且追加速度比重写要快得多,因为他们不会去寻找。 每当应用程序重新启动时,数据库会自动压缩(即以每行文档格式重新打包)。

您可以使用不带任何参数的yourDatabase.persistence.compactDatafile手动调用压缩函数。 它在执行程序中对数据文件进行压缩排队,在所有挂起操作之后依次执行。

您还可以使用yourDatabase.persistence.setAutocompactionInterval(interval)定期自动压缩,以毫秒为单位的间隔(强制执行最小5秒),并停止使用yourDatabase.persistence.stopAutocompaction()自动压缩。

请记住,压缩需要一些时间(不要太多:我的慢速机器上的50klogging需要130ms),而且在其他情况下不会发生其他操作,所以大多数项目实际上并不需要使用它。

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

当调查它的源代码时, 在 persistence.tests的search中,他们想确定检查$$delete key,他们也提到过,如果一个文档包含$$ deleted:true,那就意味着我们需要从数据中删除它。

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