将一个简单的CouchDB用于一个理论,即CouchDB压缩对删除的文档完全无动于衷。
在尝试检索时,通过DELETE方法从沙发中删除文档会产生以下结果:
本地主机:5984 / ENQ /删除-DOC-ID { “错误”: “NOT_FOUND”, “理由”: “已删除”}
预期。
现在我压缩数据库: 本地主机:5984 / ENQ / _compact {'ok':true}
检查压缩是否已完成 “compact_running”:false
现在我希望CouchDB返回not_found,在简单的GET上“丢失” 本地主机:5984 / ENQ /删除-DOC-ID { “错误”: “NOT_FOUND”, “理由”: “已删除”}
尝试使用?rev = deleted_rev给了我一个完整的文档,是的,对于没有价值的数据。
所以我认为couchdb压缩对已删除的文档没有特殊处理,并且在决定压缩的一部分时简单查看rev count rev rev limit是正确的。我们可以为已删除的文档设置特殊的rev_limit吗?
当然唯一的解决方案不能是_purge?目前我们必须拥有数千个孤立的已删除文档,虽然我们希望维护正常文档的某些版本历史记录,但我们不希望将rev_limit减少为1来协助此方案
清除时我们应该注意哪些复制问题?
答案 0 :(得分:7)
永久保留已删除的文档(因为它必须在副本之间提供最终的一致性)。所以,你描述的行为是故意的。
要尽可能高效地删除文档,请使用DELETE谓词,因为它只存储_id,_rev和已删除的标志。当然,您可以通过POST或PUT手动实现相同的操作。
最后,_purge仅存在于极端情况下,例如,您将一个重要的密码放入couchdb文档并需要将其从磁盘中删除。修剪数据库不是推荐的方法,它通常会使您拥有的任何视图无效(强制完全重建)并且也会复制混乱。
答案 1 :(得分:4)
添加文档,删除文档然后压缩不会使CouchDB数据库返回到原始状态。通过压缩保留已删除的文档,但在通常情况下,生成的文档很小(只有_id,_rev和_deleted = true)。原因是复制。想象一下:
如果在删除+压缩后文档被完全删除,则第二个复制将不知道告诉远程DB该文档是否已被删除。这将导致两个DB不一致。
报告的问题可能会导致数据库中的文档变小;但它不属于HTTP DELETE方法AFAIK(虽然我可能是错的)。门票在这里:
https://issues.apache.org/jira/browse/COUCHDB-1141
基本思想是审计信息可以包含在将通过压缩保留的DELETE中。确保您没有使用DELETE方法发布完整的doc正文(这样做可能会解释为什么文档实际上没有被删除)。
答案 2 :(得分:1)
为了澄清......根据我们的经验,您必须使用id和compact来删除DELETE才能完全删除文档数据。
如上所述,您之后仍会在数据库中拥有“标题数据”。