11

我是 CouchDB 和 PouchDB 的新手,我正在使用它来创建一个联系人管理系统,该系统可以在移动设备和桌面设备之间同步,并且可以离线使用。我看到使用 PouchDB 比编写 PHP/MySQL 后端要容易得多。

我一直在成功使用它,当我在离线设备上进行冲突更改时,CouchDB 使用一种算法来任意选择一个获胜者,然后正确地将其推送到所有设备。

我想做的是实现一个自定义算法来合并冲突的记录。这是我想使用的算法:

  1. 如果在一个客户端上删除了一条记录,而仅在另一个客户端上进行了更新,则更新的版本获胜,除非两个客户端都同意删除。
  2. 具有最近“修改”时间戳的记录成为主记录,较旧的记录成为辅助记录。
  3. 仅存在于辅助节点中(或主节点中为空)的任何字段都将移至主节点。
  4. 保存主版本,删除次版本。

CouchDB 的指南有一个很好的解释,但我不知道如何在连续复制期间使用 PouchDB API 来实现它。根据PouchDB API,复制选项中有一个“onChange”侦听器,但我不明白如何使用它来拦截冲突。

如果有人可以写一个包含一些示例代码的简短教程,我和我相信许多其他 PouchDB 用户会很感激!

4

1 回答 1

11

写一篇关于如何管理冲突解决的例子的文章是一个非常好的主意,它可能会令人困惑,但缺少一个

这个想法与 CouchDB 完全相同,为了解决冲突,您删除没有获胜的修订(并在需要时写一个新的获胜者)

#1 是 CouchDB 冲突解决的工作原理,所以你不必担心,删除的叶子不会冲突

function onChange(doc) { 
  if (!doc._conflicts) return;
    collectConflicts(doc._conflicts, function(docs) {
      var master = docs.sort(byTime).unshift();
      for (var doc in docs) {
        for (var prop in doc) {
          if (!(prop in master)) { 
            master[prop] = doc[prop];
          } 
        }
      }
      db.put(master, function(err) {
        if (!err) { 
          for (var doc in docs) {
            db.remove(doc);
          }
        }
      });     
    });
  }
}

db.changes({conflicts: true, onChange: onChange});

这将需要错误处理等,并且可以写得更好,只是一张快速的餐巾纸,描绘了代码的样子

于 2013-09-18T09:02:46.990 回答