12

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

  1. 使用文档的字段读取冲突的修订_conflicts(例如通过视图)
  2. 获取列出的所有修订的文档
  3. 执行特定于应用程序的合并
  4. 删除不需要的修订

当我想合并已删除的文档时,问题就出现了。它们不会出现在_conflicts现场,而是出现在_deleted_conflicts. 如果我只使用字段进行合并_conflicts,并且在本地数据库中删除了一个文档并在远程副本中进行了编辑,那么它将在复制时在本地复活。我的应用程序模型假设在合并时删除始终优先:已删除的文档将保持删除状态,无论它与哪些编辑冲突。

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

在 CouchDB(如果有的话)中处理删除冲突的规范方法是什么,它不涉及诸如将文档标记为已删除和在应用程序层进行过滤等粗暴的事情?

4

1 回答 1

5

最好的解决方案是使用 reserved 属性_deleted来删除文档,而不是HTTP DELETE. 然后您还可以自由设置其他属性:

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

然后在合并过程中检查 _changes 提要_deleted_conflicts并删除文档,如果 _deleted_conflicts 中存在deletedByUser标志设置为的修订true

我希望这有帮助!

于 2014-07-10T20:24:56.423 回答