【问题标题】:create or update with _conflicts instead of 409使用 _conflicts 而不是 409 创建或更新
【发布时间】:2016-10-14 15:11:08
【问题描述】:

是否可以将 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:使用最新代码更新。

【问题讨论】:

    标签: javascript couchdb pouchdb cloudant couchdb-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 的冲突仍未解决,直到您决定解决它。

    【讨论】:

    • 谢谢!这对我有帮助。一个问题。新的“myrevtoken”是如何生成的?它是应用程序的常量 uuid 吗?
    • 通常修订标记是文档内容的哈希值。但这取决于你。
    • 错字 - 在您的第二段中应该是 new_edits=false(而不是 true)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      相关资源
      最近更新 更多