我无法解决通过replicate.from()
来查询记录的问题。
我的视图设计文档如下:
{
"_id": "_design/sequences",
"views": {
"last_invoice_id": {
"map": "function(doc) {if (doc.data && doc.data.type === 'invoice' && !doc.data.metadata && !doc.meta) emit(doc.data.idib, doc.data.codigo)}"
}
}
}
相关代码部分如下所示:
const filterName = 'core_data/by_entities';
const initialReplicator = databaseLocal.replicate.from(databaseRemote, {
live: true,
retry: true,
filter: filterName,
batch_size: 500,
})
.on('paused', (err) => {
LG.debug(`
*** REPLICATION PAUSED *** `);
databaseLocal.query(
'sequences/last_invoice_id',
{ descending: true, limit: 1 },
).then(rslt => LG.debug(`\nLAST ID : ${JSON.stringify(rslt, null, 2)} `));
databaseLocal.allDocs({
include_docs: true,
attachments: true,
descending: true,
endkey: 'Invoice_1_0000000000000000',
startkey: 'Invoice_3',
limit: 1,
})
.then(rslt => LG.debug(`\nLAST INVOICE:\n${JSON.stringify(rslt, null, 2)}`))
执行后,allDocs
的结果如下所示……
2018-12-18T22:35:23.190Z [CouchDB Supervisor] debug:
LAST INVOICE:
{
"total_rows": 3903,
"offset": 0,
"rows": [
{
"id": "Invoice_1_0000000000003633",
"key": "Invoice_1_0000000000003633",
"value": {
"rev": "1-b7529876b57dccad8a7d79f83868507f"
},
"doc": {
"data": {
"idib": "3633",
"type": "invoice",
:
:
"codigo": "001-001-000009855",
:
:
},
"_id": "Invoice_1_0000000000003633",
"_rev": "1-b7529876b57dccad8a7d79f83868507f"
}
}
]
}
...但是query
的结果看起来像这样...
2018-12-18T22:35:23.229Z [CouchDB Supervisor] debug:
LAST ID : {
"total_rows": 3632,
"offset": 0,
"rows": [
{
"key": "3632",
"id": "Invoice_1_0000000000003632",
"value": "001-001-000009854"
}
]
}
如您所见,query
使用descending: true, limit: 1
仅返回找到的最后一条记录。错误地发现Invoice_1_0000000000003632
是最后一条记录。
您还可以看到,从与allDocs
相同的数据集中进行选择将返回实际上在可用记录集中找到的最后一条记录:Invoice_1_0000000000003633
。
提示:如果我插入新记录,Invoice_1_0000000000003634
,query
会更正自身,并从此返回与allDocs
相同的值。
我认为可能涉及竞争条件,与复制暂停时使用视图有关,因此我切换到单次复制。没什么。
到目前为止,除以下内容外,我没有找到其他解决方案:
allDocs
代替视图。是错误,还是我做错了什么?
(我在NodeJs 8.11.1中使用PouchDb 7.0.0)