2016-10-14 12 views
0

putまたはbulkDocsをcouchdb/pouchdbにコピーして、複製の場合と同じ動作、つまりの回答を409の代わりに受け取ることはできますか?の代わりに_conflictsを作成または更新する

基本的に私は次のコードでケースを避けたい:

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' 

私はすでに「リビジョン2」持っていた文書の中に第二の「リビジョン1」を余儀なくされています:

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

あなたはこのような呼び出しでこれを自分で行うことができます

勝者はまだ「リビジョン2」ですが、リビジョン1のコンフリクトは未解決のままです。

+0

ありがとうございます!それが正しい方向に私を助けました。しかし、質問。新しい "myrevtoken"はどのように生成されますか?それはアプリケーションのための一定のUUIDですか? – ronag

+0

通常、リビジョントークンは、ドキュメントのコンテンツのハッシュです。しかしそれはあなた次第です。 –

0

CouchDBでは、_bulk_docsリクエストでall_or_nothing: trueを設定できます。これにより、競合に関係なく新しいリビジョンが作成されます。 new_edits: falseでは、新しいリビジョンは得られません。これは複製には意味がありますが、実際にドキュメントの更新を提出している場合はそうではないかもしれません。 PouchDBのbulkDocsにall_or_nothingオプションはありません。

関連する問題