0

次のデータ構造があるとします。

{
   "name": "",
   "tags": []
}

次の例のデータを使用します。

{
   "name": "Test1",
   "tags": [
       "Laptop",
       "Smartphone",
       "Tablet"

   ]
}

{
   "name": "Test2",
   "tags": [
       "Computer",
       "Laptop",
       "Smartphone",
       "Tablet"

   ]
}

{
   "name": "Test3",
   "tags": [
       "Smartphone",
       "Tablet"
   ]
}

今私は見つけようとしています:タグにスマートフォンとタブレットを含むすべてのドキュメントを検索します。これにより、すべてのドキュメントが返されます。

これがcouchdbでどのように機能するかわかりません。タグをキーとして追加しようとしましたが、startkey / endkey で遊んで運がありませんでした。

誰かが私を助けてくれることを願っています。

こんにちは、ベン

4

1 に答える 1

1

考えられる解決策は 2 つあります。次のようなマップ機能を備えたビューがないのはなぜですか。

function(doc) {
   doc.tags && doc.tags.forEach(function(tag) {
      emit(tag, null);
   });
}

このビューを keys=["Smartphone", "Tablet"] でクエリすると、次の行が得られます。

{id: "A", key: "Smartphone", value: null},
{id: "B", key: "Smartphone", value: null},
{id: "C", key: "Smartphone", value: null},
{id: "A", key: "Tablet", value: null},
{id: "B", key: "Tablet", value: null},
{id: "C", key: "Tablet", value: null}

ここで、クライアント側でこの応答を適切に解析して、クエリのすべてのキーに表示されない ID を除外する必要があります。この場合、すべてのドキュメント (A、B、C) が表示されるため、これが結果です。取得したら、次のように一括取得を使用して値を取得できます。

POST http://...:../db/_all_docs?include_docs=true

with keys=["A", "B", "C"]

これは私がそれを行う方法です。

使用できる 2 番目のアプローチは、doc.tags のすべての可能なサブセットを発行する map 関数を使用することです。(配列内のすべての可能なサブセット コンボを見つけますか? )。このようなインデックス構造を使用すると、次を使用するだけで、単一のクエリで目的のドキュメントを取得できます。

key=["Smartphone", "Tablet"] and include_docs=true. 

ただし、これはビューに 2**n (n - タグの数) 行を出力することを意味することに注意してください。したがって、このアプローチは、各ドキュメントに少数しかないことが確実な場合にのみ使用してください。

于 2013-09-05T08:47:53.700 に答える