如何解决如何在 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 举报,一经查实,本站将立刻删除。