使用_conflicts而不是409

时间:2016-10-14 15:11:09

标签: javascript couchdb pouchdb cloudant couchdb-2.0

是否可以将putbulkDocs放入couchdb / pouchdb并获得与复制相同的行为,即使用_conflicts而不是409响应赢得修订?

基本上我想避免以下代码中的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:更新了最新代码。

2 个答案:

答案 0 :(得分:1)

CouchDB尝试保护自己免受冲突,因此如果您尝试修改CouchDB“知道”已经被取代的文档的修订版,您将得到409响应。

复制“随之而来”的方式是因为文档被批量写入目标机器并带有标志“new_edits = false”。这指示CouchDB不要监管修订令牌,而是接受传入令牌(来自复制源的写入已经有自己的修订树)。

您可以通过以下方式自行完成此操作:

ccurl -X POST -d '{"docs":[{"_id":"x","_rev":"1-myrevtoken","y":3}],"new_edits":false}' '/a/_bulk_docs'

在这种情况下,我强制将第二个“修订版1”强制转换为已经有“修订版2”的文档:

id = x
├─ 1
│  ├─ 1-myrevtoken
│  └─ 1-a6664c0114e6002415a47b18d4c9d32f
└─ 2-bca8f049e40b76dbfca560e132aa5c31 *

获胜者仍然是“修订版2”,但修订版1的冲突仍然没有得到解决,直到您决定解决它。

答案 1 :(得分:0)

使用CouchDB,您可以在_bulk_docs请求中设置all_or_nothing: true。无论冲突如何,都会创建新的修订版本。使用new_edits: false,您无法获得对复制有意义的新修订版,但如果您实际提交的是文档更新,则可能没有。 PouchDB在其bulkDocs上没有all_or_nothing选项。