【发布时间】:2018-07-15 14:53:55
【问题描述】:
假设我有这三个文件:
{ "_id": "11111", "type": "template", "name": "person" }
{ "_id": "22222", "type": "template", "name": "place" }
{ "_id": "33333", "type": "template", "name": "thing" }
我有一个云数据库,然后我有一个带有从该数据库同步的 pouchDB 的设备。
这些是我要做的步骤:
- 我将两个数据库同步在一起。所以现在我的设备上已经有了这份文档的最新版本。
- 我运行以下查询,然后我得到了所有三个模板,如下所示:
代码
var template_obj = {};
return device_db.query('filters/templates')
.then((templates) => {
for (let t of templates.rows) templates_obj[t.id] = true;
return templates_obj;
});
过滤器/模板
function (doc) {
if(doc.type == "template")
emit(doc._id);
}
返回
{ "11111": true, "22222": true, "33333": true }
我更新模板:云上的人。然后我再次更新它。所以 2 次修订没有同步到我的设备。
我与我的设备同步。
- 现在,当我运行相同的查询时,我只取回我编辑的文档。这很奇怪,因为我没有触及任何其他文件。相同的视图会在云端返回预期结果,但不会在设备上返回。
返回
{"11111": true}
- 但是,如果我执行以下代码,所有模板都会正常返回,并且来自云端的相同
_rev会显示在设备上。表示同步成功,视图变得混乱。
新代码
return device_db.allDocs({conflicts: true})
.then((data) => {
for (let d of data.rows) {
if(d.doc.type == "template") {
templates_obj[d.doc._id] = true;
}
}
return templates_obj;
}).catch((err) => {
console.log(JSON.stringify(err));
})
我开始相信这是一个错误,因为如果我销毁我的数据库并再次执行这些步骤,我可以重现此问题。
【问题讨论】:
-
请添加您用于更新文档的代码?
-
@TarunLalwani 没有代码。我直接从 Cloudant 仪表板更新它们。
-
你在对象上设置
_rev -
@TarunLalwani 如果您指的是我更新文档时,您必须包含 _rev。如果您要编辑文档,这与
Fauxton的工作方式相同。问题不在于我如何更新文档,因为过滤器在仪表板上工作。 -
试图理解:您的代码实际上将返回单个对象,而不是对象数组。正确的?关键是 ID,而不是名称。所以正确的返回值是
{'11111': true, '22222': true, '33333': true}。
标签: javascript react-native couchdb pouchdb cloudant