解决CouchDB中已删除文档的复制冲突

时间:2012-10-24 06:25:54

标签: database couchdb

官方文档推荐的解决复制冲突的方法是:

  1. 使用文档的_conflicts字段(例如通过视图)
  2. 阅读冲突的修订版
  3. 获取列出的所有修订的文档
  4. 执行特定于应用程序的合并
  5. 删除不需要的修订
  6. 当我想合并已删除的文档时,会出现此问题。它们不会显示在_conflicts字段中,而是显示在_deleted_conflicts中。如果我仅使用_conflicts字段合并,并且在本地数据库中删除文档并在远程副本中进行编辑,则它将在复制时在本地复活。我的应用程序模型假设在合并时始终优先删除:删除的文档会被删除,无论它与哪些编辑冲突。

    因此,乍一看,最简单的方法是检查_deleted_conflicts是否为空,如果不为空,请删除文档,对吧?嗯......问题在于,这可能还包含通过解决步骤#4中的编辑冲突而引入的已删除修订,因此_deleted_conflicts的含义在这种情况下是不明确的。

    在CouchDB(如果有的话)中处理删除冲突的规范方法是什么,这些冲突不涉及将文档标记为已删除和在应用程序层过滤等重要内容?

1 个答案:

答案 0 :(得分:5)

最佳解决方案是使用保留属性_deleted删除文档而不是HTTP DELETE。然后您也可以自由设置其他属性:

doc._deleted = true;
doc.deletedByUser = true;
doc.save();

然后在合并过程中检查_deleted_conflicts的_changes供稿,如果_deleted_conflicts中有deletedByUser标记设置为true的修订,则删除该文档。

我希望这有帮助!