3

基本問題

論理的に整理された大規模なドキュメントがいくつかあり、個々のドキュメントのサブセクションだけを更新したいと考えています。

この単純なドキュメントを考えると:

_id: 123456,
_rev: 3242342,
name: 'Stephen',
type: 'Person',
hobbies: [ 'sky-diving' ]

私のアプリケーションでは、取得するだけのビューを使用するaddHobbiesメソッドがあるかもしれません。

_id: 123456,
_rev: 3242342,
hobbies: [ 'sky-diving' ]

hobbiesそのため、配列に趣味を追加し、PUTこのデータのサブセットだけをドキュメントに戻すことができます。

質問

私が理解しているように、CouchDB [1.2] はこのような部分的な更新を許可していないため、保存操作中にドキュメント全体を取得し、変更をマージしてから、保存PUTするたびにドキュメント全体を元に戻す必要があると思います。

  • これを行う別の方法はありますか (CouchDB の機能について間違っていますか)?
  • この種の操作を処理するためのライブラリ (私は node.js で Express を使用しています) はありますか?
4

2 に答える 2

4

あなたは正しいです。実際、これはドキュメント データベースが意味するもの、つまりチェックアウトとチェックインです。

シム コードを作成 (または使用) して、必要なものをシミュレートし、重要な部分に集中することができます。サーバー側では、更新機能を使用できます。

クライアント側には多くのソリューションがあります。

cradle.js は、merge メソッドを使用して偽のパーシャル更新を提供します。

1 つまたは複数の属性のみを更新し、他の属性は変更しない場合は、merge() メソッドを使用できます。

db.merge('luke', {jedi: true}, function (err, res) {
    // Luke is now a jedi,
    // but remains on the dark side of the force.
});

https://github.com/cloudhead/cradle/

関連し、また Node.js には、CouchDB ドキュメントで任意のアトミック トランザクションを実行するためのTransactionがあります。

于 2012-05-13T15:28:04.437 に答える
0

クレードルには現在、ドキュメント内の単一のキーのみの更新に限定されるのではなく、 Apache がここで示しているように、フィールド値の JSON データ内のキーへのパスの更新もサポートする実際の部分更新機能が欠けていると言えます。 db.merge メソッドと同様です。

実際、cradle のソースを見ると、Database.prototype.update メソッド (lib/cradle/document.js 内) があることがわかりますが、このメソッドはドキュメント化されていないようです。

これをクレードルの不可欠な部分にすることができれば、CouchDB ビューの更新に対して部分的な更新のみを個別に要求する必要がなくなります。

于 2014-01-13T15:23:49.360 に答える