【发布时间】:2019-07-10 06:51:10
【问题描述】:
我正在尝试实施如下所述的流程:
- 在设备中创建
sale_transaction文档。 - 将
sale_transaction文件放入Pouch。 - 由于 Pouch 和 Couch 之间存在实时复制,因此让
sale_transaction文档流向 Couch。 - 将
sale_transaction文档成功复制到 Couch 后,删除 Pouch 中的文档。 - 不要让 Pouch 中的
deleted sale_transaction文档流过 Couch。
目前,我已经实现了两个数据库的双向同步,我正在过滤从 Couch 到 Pouch 的每个文档,反之亦然。
对于从 Couch 到 Pouch 的复制,我不想让 sale_transaction 文档通过,因为我只能从 Couch 获取这些文档。
PouchDb.replicate(remoteDb, localDb, {
// Replicate from Couch to Pouch
live: true,
retry: true,
filter: (doc) => {
return doc.doc_type!=="sale_transaction";
}
})
对于从 Pouch 到 Couch 的复制,我设置了一个过滤器,不让 deleted sale_transaction 文档通过。
PouchDb.replicate(localDb, remoteDb, {
// Replicate from Pouch to Couch
live: true,
retry: true,
filter: (doc) => {
if(doc.doc_type==="sale_transaction" && doc._deleted) {
// These are deleted transactions which I dont want to replicate to Couch
return false;
}
return true;
}
}).on("change", (change) => {
// Handle change
replicateOutChangeHandler(change)
});
我还实现了一个更改处理程序来删除 Pouch 中的 sale_transaction 文档,在写入 Couch 之后。
function replicateOutChangeHandler(change) {
for(let doc of change.docs) {
if(doc.doc_type==="sale_transaction" && !doc._deleted) {
localDb.upsert(doc._id, function(prevDoc) {
if(!prevDoc._deleted) {
prevDoc._deleted = true;
}
return prevDoc;
}).then((res)=>{
console.log("Deleted Document After Replication",res);
}).catch((err)=>{
console.error("Deleted Document After Replication (ERROR): ",err);
})
}
}
}
一开始似乎数据流是正常的,但是当我从 Couch 获取sale_transaction 文档,然后进行一些编辑时,我不得不重复在 Pouch 中编写文档的过程,然后让它流到 Couch,然后在 Pouch 中将其删除。但是,在对同一文档进行一些编辑后,Couch 中的文档也已被删除。
我是 Pouch & Couch 的新手,特别是 NoSQL,我想知道我在这个过程中是否做错了什么。
【问题讨论】:
-
您为什么不简单地在内存中编辑/创建文档,然后他们将它们直接推送到 CouchDB?
-
@AlexisCôté 我在考虑设备无法访问互联网的情况。因此,如果我将文档推送到 Pouch,并且没有互联网连接,我将依靠 Pouch 的本机复制将文档同步到 Couch。
标签: javascript couchdb pouchdb nosql