3

次のような 239800 個のドキュメントのリストがあるとします。

{
    name: somename,
    data:{age:someage, income:somevalue, height:someheight, dumplings_consumed:somenumber}
}

doc.data.agedoc.data.incomeheightでドキュメントにインデックスをdumplings_consumed付け、各パラメーターの範囲を指定した後にドキュメントのリストを取得できることはわかっていますが、次のようなクエリの結果を取得するにはどうすればよいですか。

年齢が 25 ~ 30 歳で、収入が $10 未満で、身長が 7 フィートを超えるドキュメントのリストは?

複数のインデックスを機能させる方法はありますか?

4

2 に答える 2

2

サンプル クエリ パラメータの 3 つすべてが動的である必要があると仮定すると、単一の CouchDB クエリでそのような結合を行うことはできません。最も簡単な戦略は、データの「最大の」側面/次元を絞り込むことができるインデックスを発行し、アプリのコードまたは _list 関数で残りを除外することです。

ここで、数値データの2 つの側面をフィルタリングするために、 GeoCouchを使用できる可能性があります。これは、緯度と経度だけに限定されない、汎用の 2 次元インデックスを提供します! したがって、x と y にマッピングされた (たとえば)「年齢」と「収入」を含むポイントを出力します。次に、最初の 2 つの「中間」パラメーターを使用して bbox をクエリし、アプリ側で高さを除外するだけで済みます。

于 2012-11-09T23:01:46.297 に答える
1

見てみましょう:

http://guide.couchdb.org/draft/views.html

任意の式 (JavaScript コード) で検索し、それを使用してドキュメントをインデックス化できます。

たとえば、Futon を使用して、テスト データベースを作成し、質問に基づいて次の 2 つのドキュメントを追加できます。

{ "_id": "36fef0472fb7eec035c87e4f4b0381bf", "_rev": "12-4ef9014a3670a7e6acd58ad92d26fc1e", "データ": { "年齢": 6, "収入": 10, "身長": 20, "餃子_消費": 5 }, "名前": "ジョー" }

{ "_id": "36fef0472fb7eec035c87e4f4b038ffa", "_rev": "8-f0a0a51b830bf3d4bc3ec5697440792f", "名前": "マイク", "データ": { "年齢": 27, "収入": 9, "身長": 78, "dumplings_consumed": 256 } }

Futon を使用してデータベースに移動し、次の Map 関数を使用して一時ビューを作成するだけです。

function(doc) { var 年齢、収入、身長; if (doc.name && doc.data && doc.data.age && doc.data.income && doc.data.height) { if ( doc.data.age > 25 && doc.data.age < 30 && doc.data .income < 10 && doc.data.height > 7) { emit(doc.name, doc.data); } } }

実行するだけで結果が得られます。

永続的なビューでは、リクエストが最初に実行されるときに内部 B ツリーが構築され、時間がかかります。ドキュメントがデータベースに追加された場合でも、それ以降の実行は非常に高速である必要があります (ドキュメントの数が全体の一部である限り)。

于 2013-09-03T06:00:47.013 に答える