微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 RxDB 中的 pouchdb 实例上调用 bulkDocs 时同步修订

如何解决如何在 RxDB 中的 pouchdb 实例上调用 bulkDocs 时同步修订

我正在尝试批量更新一些 RxDB 文档,因为 RxDB 没有批量更新功能,我必须在内置 pouchdb 实例上使用 bulkDocs 功能。我可以成功地做到这一点,但后来我的修订不同步。使用 pouchdb 实例时,有没有办法将 rxdb 修订版与 pouchdb 同步?

我的代码

async bulkupdate(docs) {
  let db = await ProjectDB.get();
  let data = [];
  let nodeDocs = await db.collections.nodes.find().exec();

  _.each(docs,doc => {
    let matchingDoc = _.find(nodeDocs,n => {return n.id === doc._id});
    if (matchingDoc) {
      data.push(_.omit(_.assign({_id: matchingDoc.id,_rev: matchingDoc.revision},matchingDoc.toJSON(),doc),"id"));
    }
  });

  await db.collections.nodes.pouch.bulkDocs({docs: data},{force: true}).then(docs => {
    _.each(docs,doc => {
      console.log(doc);
    })
  })
}

解决方法

解决方案:需要为相关的 rxdb 文档发出更改事件以进行同步。

我从 rxdb 存储库中获取了一些代码并进行了调整:

static async bulkUpdate(collection,docs) {
    let db = await ProjectDB.get();
    let docIds = _.map(docs,doc => {return doc.id});
    let rxDocs = await collection.findByIds(docIds);
    let updatedDocs = new Map();
    let bulkUpdateDocs = [];

    _.each(docs,doc => {
      let matchingDoc = rxDocs.get(doc.id);
      if (matchingDoc) {
        bulkUpdateDocs.push(_.omit(_.assign({_id: matchingDoc.id,_rev: matchingDoc.revision},matchingDoc.toJSON(),doc),"id"));
        updatedDocs.set(doc.id,_.assign({_rev: matchingDoc.revision},doc))
      }
    });

    let startTime,okResults;
    const results = await db.lockedRun(async () => {
      startTime = Date.now();
      return await collection.pouch.bulkDocs({docs: bulkUpdateDocs});
    });
    const endTime = Date.now();

    okResults = results.filter((r: any) => r.ok);

    // for each updated doc a change event is emitted that the rxdb collection may subscribe to...
    _.each(okResults,r => {
      let originalDoc = rxDocs.get(r.id);
      let updatedDoc = updatedDocs.get(r.id);
      if (originalDoc) {
        updatedDoc._rev = r.rev;

        let changeEvent = new RxChangeEvent(
          'UPDATE',updatedDoc.id,updatedDoc,db.token,collection.name,false,startTime,endTime,originalDoc._data,originalDoc,);
        originalDoc.$emit(changeEvent);
      }
    });
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。