CouchDB压缩和文档删除-压缩无关?

CouchDB压缩和文档删除-压缩无关?,couchdb,Couchdb,以一个简单的CouchDB为例,我们认为CouchDB压缩与删除的文档完全无关 尝试检索时,通过DELETE方法从Coach中删除文档会产生以下结果: localhost:5984/enq/deleted doc id {“错误”:“未找到”,“原因”:“已删除”} 预料之中 现在我压缩数据库: 本地主机:5984/enq/_compact {'ok':正确} 并检查压实是否完成 “compact_running”:错误 现在我希望CouchDB返回not_found,在一个简单的GET上解释“

以一个简单的CouchDB为例,我们认为CouchDB压缩与删除的文档完全无关

尝试检索时,通过DELETE方法从Coach中删除文档会产生以下结果:

localhost:5984/enq/deleted doc id {“错误”:“未找到”,“原因”:“已删除”}

预料之中

现在我压缩数据库: 本地主机:5984/enq/_compact {'ok':正确}

并检查压实是否完成 “compact_running”:错误

现在我希望CouchDB返回not_found,在一个简单的GET上解释“missing” localhost:5984/enq/deleted doc id {“错误”:“未找到”,“原因”:“已删除”}

尝试使用?rev=deleted_rev会给我一个完整的文档,是的,对于毫无价值的数据

所以我认为couchdb压缩对删除的文档没有特殊处理,simple在决定压缩的一部分时会再次查看rev count rev limit。我们是否可以为已删除的文档设置特殊的版次限制

当然唯一的解决办法不可能是清洗?目前,我们必须有数千个孤立的已删除文档,虽然我们希望为普通文档维护一些版本历史记录,但我们不希望将rev_限制降低到1以帮助实现这种情况


清除时我们应该注意哪些复制问题?

添加文档、删除文档然后压缩不会使CouchDB数据库返回原始状态。删除的文档通过压缩来保留,但在通常情况下,生成的文档很小(只有_id、_rev和_deleted=true)。原因是复制。想象一下:

  • 创建文档
  • 将数据库复制到远程数据库
  • 删除文档
  • 紧凑型数据库
  • 再次将数据库复制到远程数据库
如果文档在删除+压缩后被完全删除,那么第二次复制将无法通知远程数据库文档已被删除。这将导致两个数据库不一致

报告的问题可能导致DB中的文件不小;然而,它与HTTP DELETE方法AFAIK无关(尽管我可能错了)。车票在这里:


其基本思想是审计信息可以包含在删除中,并通过压缩保存。确保您没有使用DELETE方法发布完整的文档正文(这样做可能会解释为什么文档没有实际删除)。

删除的文档会永久保留(因为这对于提供副本之间的最终一致性至关重要)。所以,你描述的行为是故意的

要尽可能高效地删除文档,请使用delete动词,因为它只存储_id、_rev和deleted标志。当然,您可以通过POST或PUT手动实现相同的功能


最后,_purge只在极端情况下存在,例如,您将一个重要密码放入couchdb文档中,需要将其从磁盘中删除。这不是修剪数据库的推荐方法,它通常会使您拥有的任何视图无效(强制进行完全重建),并干扰复制。

为了澄清。。。根据我们的经验,为了完全删除文档数据,您必须使用id和compact进行删除

正如上面所指出的,之后您的数据库中仍然会有“头数据”