使用 _conflicts 而不是 409 创建或更新
create or update with _conflicts instead of 409
是否有可能 put
或 bulkDocs
进入 couchdb/pouchdb 并获得与复制相同的行为,即使用 _conflicts
而不是 [=14] 赢得修订=]回应?
基本上我想避免以下代码中的 conflict
情况:
const docs = Object
.keys(pendingSet)
.map(id => toDoc(deepClone(pendingSet[id]), { id, rev: this.revCache.get(id) }))
const results = await this.db.bulkDocs(docs)
const conflicts = []
for (let n = 0; n < results.length; ++n) {
const result = results[n]
if (result.error === 'conflict') {
// TODO: This needs review...
const doc = await this.db.get(docs[n]._id)
const rev = `${doc._rev.split('-')[0]}-${this.serverName}`
conflicts.push({
...docs[n],
_rev: rev
})
this.revCache.set(doc._id, rev)
} else if (result.error) {
callback(result.error)
} else {
this.revCache.set(result.id, result.rev)
}
}
await this.db.bulkDocs(conflicts, { new_edits: false })
我从 pouchdb 那里得到了一些提示,但我仍然不确定如何应用它。
EDIT1:更新了最新代码。
CouchDB 试图保护自己免受冲突影响,因此如果您尝试修改 CouchDB 'knows' 已经被取代的文档的修订版,您将收到 409 响应。
复制"gets away with it"的方式是因为文档是批量写入带有标志"new_edits=false"的目标机器。这指示 CouchDB 不要监管修订令牌,而是接受传入的令牌(来自复制源的写入已经有自己的修订树)。
您可以通过这样的调用自己完成此操作:
ccurl -X POST -d '{"docs":[{"_id":"x","_rev":"1-myrevtoken","y":3}],"new_edits":false}' '/a/_bulk_docs'
在这种情况下,我将第二个 "revision 1" 强行放入一个已经有 "revision 2":
的文档中
id = x
├─ 1
│ ├─ 1-myrevtoken
│ └─ 1-a6664c0114e6002415a47b18d4c9d32f
└─ 2-bca8f049e40b76dbfca560e132aa5c31 *
获胜者仍然是 "revision 2",但修订版 1 的冲突仍未解决,直到您决定解决它。
使用 CouchDB,您可以在 _bulk_docs 请求中设置 all_or_nothing: true
。无论冲突如何,这都会创建新的修订。使用 new_edits: false
您不会获得对复制有意义的新修订,但如果您实际提交的是文档更新,则可能不会。 PouchDB 在其 bulkDocs 上没有 all_or_nothing 选项。
是否有可能 put
或 bulkDocs
进入 couchdb/pouchdb 并获得与复制相同的行为,即使用 _conflicts
而不是 [=14] 赢得修订=]回应?
基本上我想避免以下代码中的 conflict
情况:
const docs = Object
.keys(pendingSet)
.map(id => toDoc(deepClone(pendingSet[id]), { id, rev: this.revCache.get(id) }))
const results = await this.db.bulkDocs(docs)
const conflicts = []
for (let n = 0; n < results.length; ++n) {
const result = results[n]
if (result.error === 'conflict') {
// TODO: This needs review...
const doc = await this.db.get(docs[n]._id)
const rev = `${doc._rev.split('-')[0]}-${this.serverName}`
conflicts.push({
...docs[n],
_rev: rev
})
this.revCache.set(doc._id, rev)
} else if (result.error) {
callback(result.error)
} else {
this.revCache.set(result.id, result.rev)
}
}
await this.db.bulkDocs(conflicts, { new_edits: false })
我从 pouchdb 那里得到了一些提示,但我仍然不确定如何应用它。
EDIT1:更新了最新代码。
CouchDB 试图保护自己免受冲突影响,因此如果您尝试修改 CouchDB 'knows' 已经被取代的文档的修订版,您将收到 409 响应。
复制"gets away with it"的方式是因为文档是批量写入带有标志"new_edits=false"的目标机器。这指示 CouchDB 不要监管修订令牌,而是接受传入的令牌(来自复制源的写入已经有自己的修订树)。
您可以通过这样的调用自己完成此操作:
ccurl -X POST -d '{"docs":[{"_id":"x","_rev":"1-myrevtoken","y":3}],"new_edits":false}' '/a/_bulk_docs'
在这种情况下,我将第二个 "revision 1" 强行放入一个已经有 "revision 2":
的文档中id = x
├─ 1
│ ├─ 1-myrevtoken
│ └─ 1-a6664c0114e6002415a47b18d4c9d32f
└─ 2-bca8f049e40b76dbfca560e132aa5c31 *
获胜者仍然是 "revision 2",但修订版 1 的冲突仍未解决,直到您决定解决它。
使用 CouchDB,您可以在 _bulk_docs 请求中设置 all_or_nothing: true
。无论冲突如何,这都会创建新的修订。使用 new_edits: false
您不会获得对复制有意义的新修订,但如果您实际提交的是文档更新,则可能不会。 PouchDB 在其 bulkDocs 上没有 all_or_nothing 选项。