8

複数のフィールドをフィルタリングして、CouchDB からデータを取得するにはどうすればよいですか。

たとえば、名前、州、国などのフィールドを持つ人物データベースがあるとします。およびWebページの検索フォーム、null以外の条件のみを考慮して、CouchDBからデータを取得するにはどうすればよいですか。

SQL では、where 句WHERE Person.Name="John" AND Person.State in ("NY","CA")に条件を追加しますが、このクエリを CouchDB ビューとしてフレーム化するにはどうすればよいですか

4

2 に答える 2

7

CouchDB では、map/reduce ビューを使用します。SQL では、作成するフィールド インデックスを明示的に指定する必要があります。CouchDB では、インデックスを作成するカスタム関数を作成するため、ニーズに合わせてより具体的にすることができます。名前、州、および国フィールドを使用した検索のような単純なことのインデックスが必要な場合、ビューは単なるマップ関数です。

function (doc) {
  if (doc.name && doc.state && doc.country)
    emit([doc.name, doc.state, doc.country], doc);
}

このビューを使用して検索するには、キーを検索します["my_name", "my_state", "my_country"]。map の検索可能な結果は辞書順でソートされるため、出力された配列のプレフィックスである限り、名前、州、および国のサブセットを使用してクエリを実行するために使用できます ( and を使用nameせずに検索するstateなど)。country

原則として、ビューはクエリのいくつかの機能を備えたインデックスですが、SQL クエリほど柔軟ではありません。それらは一度実行されてディスクに保存され、新規/変更されたデータに対して増分的に計算されます。分散システム (CouchDB が設計されている) では非効率なことを行うのは難しいことに注意してください: より複雑な結合、インデックスなしでの検索... ただし、多くの場合、リレーショナル モデルのテーブルの人為的な分割は、構造化されている場合は必要ありません。ドキュメントが利用可能であり、一部の結合は必要ありません。

CouchDB と SQL の簡単な比較については、The Definitive Guide book のこの章と他の章、およびビューの詳細については公式wikiを参照してください。

于 2013-03-07T19:10:43.263 に答える
0

[doc.name, doc state] を含むビューを作成する必要があります。これはドキュメントで十分に説明されています。本当の問題は、2 つのランダムな状態から人物を選択する方法です。

この質問に答える良い記事があります: Using Multiple Start and End Keys for CouchDB Views

于 2013-03-10T07:58:01.527 に答える