2016-10-14 5 views
0

Можно ли put или bulkDocs в CouchDB/pouchdb и получить такое же поведение, как при репликации, то есть выигрыш пересмотра с _conflicts вместо 409 ответа?создать или обновить с _conflicts вместо 409

В основном я хотел бы избежать случая в следующем коде:

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: Обновлен по последнему коду.

ответ

1

CouchDB пытается защитить себя от конфликтов, поэтому, если вы попытаетесь изменить версию документа, который CouchDB «знает», который уже был заменен, вы получите ответ 409.

Способ репликации «сходит с рук» заключается в том, что документы навалом записываются на целевую машину с флагом «new_edits = true». Это инструктирует 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 остается нерешенным, пока вы не решите его решить.

+0

Спасибо! Это помогло мне в правильном направлении. Вопрос, хотя. Как генерируется новый «myrevtoken»? Это постоянный uuid для приложения? – ronag

+0

Обычно токен ревизии является хешем содержимого документа. Но это зависит от вас. –

0

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

Смежные вопросы