создавать или обновлять с помощью _conflicts вместо 409

Возможно ли это putили bulkDocsв 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,

0

Ответов: 2


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
  L- 1-a6664c0114e6002415a47b18d4c9d32f
L- 2-bca8f049e40b76dbfca560e132aa5c31 *

Победителем остается «ревизия 2», но конфликт в редакции 1 остается нерешенным, пока вы не решите его решить.


0

С CouchDB вы можете установить all_or_nothing: trueзапрос _bulk_docs. Это создает новые изменения независимо от конфликтов. У new_edits: falseвас нет новой версии, которая имеет смысл для репликации, но, возможно, нет, если вы действительно отправляете обновление документа. PouchDB не имеет опции all_or_nothing в своих файлах bulkDocs.

JavaScript, CouchDB, pouchdb, Cloudant, CouchDB-2,0,
Похожие вопросы