2

私は、couchdb ビューに関する問題の一般的な解決策を探しています。

たとえば、ビューの結果は次のようになります。

{"total_rows":4,"offset":0,"rows":[
{"id":"1","key":["imported","1"],"value":null},
{"id":"2","key":["imported","2"],"value":null},
{"id":"3","key":["imported","3"],"value":null},
{"id":"4","key":["mapped","4"],"value":null},
{"id":"5,"key":["mapped","5"],"value":null}
]

1)「インポートされた」ドキュメントのみを選択したい場合は、これを使用します:

view?startkey=["imported"]&endkey=["imported",{}]

2) 2 より大きい ID を持つすべてのインポートされたドキュメントを選択する場合:

view?startkey=["imported",2]&endkey=["imported",{}]

3) ID が 2 から 4 のすべてのインポートされたドキュメントを選択する場合:

view?startkey=["imported",2]&endkey=["imported",4]

私の質問は: ID が 2 から 4 のすべての行を選択するにはどうすればよいですか?

4

2 に答える 2

2

上記のソリューションを拡張してみることができますが、キーの前に次のような「インデックスを発行」フラグを追加します。

map: function (doc) {
  emit ([0, doc.number, doc.category]); // direct order
  emit ([1, doc.category, doc.number]); // reverse order
}

でリクエストできるようになります

view?startkey=[0, 2]&endkey=[0, 4, {}]

また

view?startkey=[1, 'imported', 2]&endkey=[1, 'imported', 4]

しかし、とにかく 2 つの異なるビューの方が優れています。

于 2012-06-11T18:26:43.110 に答える
1

少し前に同じ問題に遭遇したので、私の解決策を説明します。emit()マップ関数の内部では、複数の呼び出しを行うことができます。あなたの場合のマップ関数は次のようになります。

function(doc) {
  emit([doc.number, doc.category], null);
  emit([doc.category, doc.number], null);
}

?include_docs=trueを使用して、任意のクエリからドキュメントを取得することもできます。次に、行 2 から 4 を取得するクエリは次のようになります。

view?startkey=[2]&endkey=[4,{}]

CouchDB View Collat​​ionでソートのルールを表示できます

于 2012-06-05T19:31:25.640 に答える