-1

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

1 回答 1

0

解决方案:需要为相关的 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);
      }
    });
  }
于 2021-05-26T18:39:05.590 回答