5

_changesリクエストに対するCouchDBからの応答は、次の形式で返されます:{"seq":12、 "id": "foo"、 "changes":[{"rev": "1-23202479633c2b380f79507a776743d5"}]}

私の質問-「changes」要素が配列であるのはなぜですか?変更要素に複数のアイテムを返すシナリオはどれですか?私はオンラインで複数のアイテムの例を見たことがなく、私自身の経験では1つのアイテムしか見たことがありません。

変更と相互作用するコードを書いていますが、実際に複数のアイテムがあった場合の対処方法を理解したいと思います。

ありがとう、マイク

4

1 に答える 1

8

changes 要素は、ドキュメントの既存のすべてのリビジョン リーフを反映する配列です。ご存知のように、CouchDB はドキュメントを完全には削除しませんが、代わりに墓石を設定して、まだ削除されていない古いリビジョンを持つソースからのレプリケーション後に誤って復活するのを防ぎます。また、レプリケーション後に発生した更新の競合により、複数のリーフが存在する可能性があります。例えば:

  1. Mike はデータベース A にドキュメントを作成し、データベース B に複製しました。

    {"results":[ {"seq":1,"id":"thing","changes":[{"rev":"1-967a00dff5e02add41819138abb3284d"}]} ], "last_seq":1}

  2. John はあなたのドキュメントを受け取り、データベース B で彼を更新しました。

    {"results":[ {"seq":2,"id":"thing","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]}], "last_seq":2}

  3. しかし同時に、Mike はデータベース A にいくつか変更を加えました (データをクリーンアップするのを忘れたり、何か重要なことを追加するのを忘れていました)。

    {"results":[ {"seq":2,"id":"thing","changes":[{"rev":"2-13839535feb250d3d8290998b8af17c3"}]} ], "last_seq":2}

  4. そして、彼をデータベース B に再度複製しました。John は競合状態のドキュメントを受け取り、変更フィードをクエリ パラメータでstyle=all_docs見て、次の結果を確認します。

    {"results":[ {"seq":3,"id":"thing","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"},{"rev":"2-13839535feb250d3d8290998b8af17c3"}] } ], "last_seq":3}

    ドキュメントへの直接アクセスは、勝者のリビジョン (より高い seq 番号または最新のもの) からデータを返しますが、多くの競合するリビジョンを持つ可能性があります (相互に複製される多数のデータベース内で単一のドキュメントに対する同時書き込みを想像してください)。

  5. ここで、John はこの競合を解決して実際のリビジョンを更新することを決定しましたが、他のリビジョンは削除しました。

    {"results":[ {"seq":4,"id":"thing","changes":[{"rev":"3-2502757951d6d7f61ccf48fa54b7e13c"},{"rev":"2-13839535feb250d3d8290998b8af17c3"}] } ], "last_seq":4}

  6. ちょっと待って、Mike のリビジョンはまだあるの?なんで?パニックに陥ったジョンは、自分の文書を削除します。

    {"results":[ {"seq":5,"id":"thing","changes":[{"rev":"2-13839535feb250d3d8290998b8af17c3"}{"rev":"4-149c48caacb32c535ee201b6f02b027b"}]} ]、「last_seq」:5}

    現在、彼のバージョンの文書は削除されていますが、Mike の文書にはアクセスできます。

  7. John の変更をデータベース B からデータベース A にレプリケートすると、すべて廃棄されます。

    {"results":[ {"seq":3,"id":"thing","changes":[{"rev":"3-2adcbbf57013d8634c2362630697aab6"},{"rev":"4-149c48caacb32c535ee201b6f02b027b"}] } ], "last_seq":3}

    なんでそうなの?これは彼のデータの「進化」に関するドキュメント履歴であるため、現実の世界では、ドキュメントには多数のデータベースに分散された多くの中間リーフがあり、データ複製プロセスによるサイレント データ上書きを防ぐために、CouchDB はそのような競合を解決するために各リーフを保持します。レプリケーションと競合に関する CouchDB wiki で見つけられるかもしれない、より多くの、おそらくより良い説明。変更フィードのクエリ パラメータもそこに記述されています。

于 2013-02-13T02:06:24.403 に答える