如何在pouchdb中实现部分更新?

How can you implement partial updates in pouchdb?

本文关键字:更新 实现部 pouchdb      更新时间:2023-09-26

假设您有以下文档:

{ title: 'take out the trash', priority: 'medium' }

并且有两个不同的客户端同时编辑此数据,例如客户端1想要将标题更改为清洁盘子,客户端2想要将优先级更改为high

如何使用pouchdb实现?

更新处理程序和部分更新在couchdb中得到支持,但是它们需要对每个更新进行REST调用,这违背了使用pouchdb离线工作并稍后同步的目的。另一个解决方案是使用every doc is a delta方法。

这个函数检索所有的文档:

function merge(obj1, obj2) {
  for (var i in obj2) {
    obj1[i] = obj2[i];
  }
}
function all(db) {
  return new Promise(function(fulfill, reject) {
    var docs = {};
    db.allDocs({include_docs: true}, function(err, doc) {
      // sort by createdAt as cannot guarantee that order preserved by pouch/couch
      doc.rows.sort(function(a, b) {
        return a.doc.$createdAt > b.doc.$createdAt;
      });
      doc.rows.forEach(function(el, i) {
        if (!el.doc.$id) { // first delta for doc?
          el.doc.$id = el.doc._id;
        }
        if (docs[el.doc.$id]) { // exists?
          merge(docs[el.doc.$id], el.doc);
        } else {
          docs[el.doc.$id] = el.doc;
        }
        if (i == doc.rows.length - 1) { // last element?
          fulfill(docs);
        }
      });
    });
  });
}

和这个函数允许你做部分更新:

function put(object, db) {
  object.$createdAt = (new Date()).toJSON();
  return new Promise(function(fulfill, reject) {
    db.post(object).then(function(object) {
      fulfill(object);
    });
  });
}

完整示例请参见使用Pouch

进行部分更新