PouchDB紧凑()调用

3

我有一个从couchdb (couchappy.com) 复制而来的 pouchDB 数据库。复制是不实时的,只在特定条件下运行(例如应用程序的加载/初始化、最终用户更改某些选项等)。

我已经在couchdb中删除了一些文档,这些文档在pouchdb中显示为“已删除”。然后我想压缩我的pouchdb: db.compact() 调用。但是这个调用似乎对已删除的文档没有什么作用。

请注意,我已经压缩了counchdb。

我正在使用pouchdb 2.2.0。

你们有人知道 compact() 调用在pouchdb上实际执行了什么操作吗? 此外,如何摆脱“已删除”的文档?

谢谢, Alberto

1个回答

5
CouchDB和PouchDB始终为已删除的文档保留“墓碑”修订版,否则在复制过程中会出现奇怪的情况。因此,在压缩期间这些已删除的文档不会消失;压缩只会清除旧于最新版本的任何修订版。
还有一个“清除”命令可以真正消除文档及其历史记录,但这相当激进,并且大多数时候除非必须,否则不要这样做(source)。此外,尽管正在进行中,但PouchDB尚不支持它。
如果您只担心文档占用空间,而不是简单地调用pouch.remove(),您可以执行以下操作:
pouch.get('mydoc').then(function (doc) {
  var deletedDoc = {
    _id      : doc._id,
    _rev     : doc._rev,
    _deleted : true
  };
  return pouch.put(doc);
}).then(function (res) {
  // etc.
}).catch(function (err) {
  // etc.
};

场景如下: (1) 在客户端运行复制程序 -> 获取文档A; (2) 在couchDB中删除文档A; (3) 在客户端运行复制程序 -> 文档A将获得“已删除”标志。我只进行单向复制,所以我不认为有必要在客户端保留这些"墓碑"。我了解到客户端已经有一个本地变量来跟踪上次复制的时间。你觉得呢? - tup
墓碑是确保复制在许多客户端/服务器之间保持一致的非常基本的部分。例如,您可以想象一个情况,在步骤2和3之间,多主设置中的另一个服务器修改了相同的文档(而不是删除),然后两个服务器都尝试与客户端同步。如果需要处理冲突,客户端需要知道存在冲突。如果您想了解更多信息,Couch复制文档可能会有所帮助。 - nlawson
如果在CouchDb中执行了清除操作,那么这是否会传播到PouchDb实例,并因此清理墓碑?有更好的方法吗? - Tony O'Hagan
purge()在PouchDB中尚未实现,这是一个公开问题。墓碑真的占用了那么多空间吗?在我们的实现中,它应该只是{_id:'foo',_deleted:true}的大小;没有旧数据被保留。 - nlawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接