如何通过连续复制解决冲突

Col*_*kow 11 couchdb database-replication pouchdb

我是CouchDB和PouchDB的新手,并且正在使用它来创建一个可以在移动和桌面设备上同步的联系人管理系统,并且可以脱机使用.我发现使用PouchDB比编写PHP/MySQL后端要容易得多.

我一直在成功使用它,当我在离线设备上做出相互矛盾的更改时,CouchDB使用一种算法随意挑选一个胜利者,然后将其正确地推送到所有设备.

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

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

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

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

小智 10

撰写一篇文章,其中包含如何管理冲突解决方案的示例,这是一个非常好的主意,它可能令人困惑,但缺少一个

这个想法与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});
Run Code Online (Sandbox Code Playgroud)

这将需要错误处理等,可以写得更好,只是一个快速的餐巾纸绘制的代码可能是什么样子