8

couchdb では、キーでフィルタリングする必要があり、これは次のように行われます。

{
   "_id": "_design/test",
   "_rev": "6-cef7048c4fadf0daa67005fefe",
   "language": "javascript",
   "views": {
       "all": {
           "map": "function(doc) { if (doc.blogId) {emit(doc.key, doc);} }"
       }
   }
}

ただし、結果は別のキー (doc.anotherkey) で並べ替える必要があります。同じ関数を使用して、別のキーでフィルタリングと順序付けの両方を実現するにはどうすればよいですか。

ありがとうございました

4

1 に答える 1

7

singlekeyでのみクエリする必要がある場合は、次のマップを使用できます。

function (doc) {
  if (doc.blogId) {
    emit([doc.key, doc.anotherkey], 1);
  }
}

"KEY"およびwithのクエリ?startkey=["KEY"]&endkey=["KEY",{}]&include_docs=true

ここでは、 CouchDB の照合仕様に従って:

  • ["KEY"]は、どの値よりも小さい["KEY","OTHER"]値です (より長い配列はプレフィックスの後にソートされるため["KEY2","OTHER"]) "KEY2" < "KEY"
  • andはJSON オブジェクトでない場合(JSON オブジェクトは他の JSON 値の後に来るため)、どの値["KEY",{}]よりも大きい値ですが、 withのどの値よりも小さい値です。["KEY","OTHER"]doc.otherkey["KEY2","OTHER"]"KEY2" > "KEY"

もちろん、これは文字列に限ったことではありません。照合が正しい限り、どのタイプの値でも機能します。

startkeyとの値を URL エンコードすることを忘れないでくださいendkey。たとえば、curlデータベースが「DB」であると仮定して使用します。

curl 'http://localhost:5984/DB/_design/test/_view/all?startkey=%5B%22KEY%22%5D&endkey=%5B%22KEY%22,%7B%7D%5D&include_docs=true'

ディスク容量を節約するために、include_docsドキュメント全体を出力する代わりに、クエリ パラメータを使用したことに注意してください。emit(..., doc)クエリ パラメータについては、CouchDB ドキュメントに記載されています。

結果を降順で並べ替えるには、クエリ パラメータを使用し、決定版ガイド ブックに記載されているようにとdescending=trueの値を入れ替えます。startkeyendkey

curl 'http://localhost:5984/DB/_design/test/_view/all?endkey=%5B%22KEY%22%5D&startkey=%5B%22KEY%22,%7B%7D%5D&include_docs=true&descending=true'
于 2012-01-19T15:06:41.927 に答える