【问题标题】:How to sync revisions when calling bulkDocs on pouchdb instance in RxDB如何在 RxDB 中的 pouchdb 实例上调用 bulkDocs 时同步修订
【发布时间】:2021-05-21 19:17:22
【问题描述】:

我正在尝试批量更新一些 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);
    })
  })
}

【问题讨论】:

    标签: javascript node.js pouchdb bulkupdate rxdb


    【解决方案1】:

    解决方案:需要为相关的 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}, matchingDoc.toJSON(), 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);
          }
        });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多