我正在使用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);
答案 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,则表示我们需要删除它来自数据``。
所以,在我看来,你可以尝试手动压缩数据库,或者在你的问题中;第二种方式很有用。