Couch DB按键过滤并按其他字段排序

Dil*_*han 8 javascript couchdb couchrest

在couchdb中,我需要按键过滤,这样就完成了.

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

但是,结果应该由另一个键(doc.anotherkey)排序.因此,使用相同的功能如何通过另一个键实现过滤和排序.

谢谢

Mar*_*cio 7

如果您只需要单一查询key,则可以使用以下地图:

function (doc) {
  if (doc.blogId) {
    emit([doc.key, doc.anotherkey], 1);
  }
}
Run Code Online (Sandbox Code Playgroud)

和查询"KEY"?startkey=["KEY"]&endkey=["KEY",{}]&include_docs=true.

在这里,根据CouchDB整理规范:

  • ["KEY"]比任何一个值较小["KEY","OTHER"]的值(因为较长的阵列及其前缀后排序)比任何,但大于["KEY2","OTHER"]"KEY2" < "KEY";
  • ["KEY",{}]是一个值大于任何更大["KEY","OTHER"]值时,如果doc.otherkey是从未JSON对象(因为JSON对象谈到任何其他JSON值之后),但比任何较小的["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'
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了include_docs查询参数,而不是发出整个文档emit(..., doc),以节省磁盘空间.查询参数记录在CouchDB文档中.

要以降序排序结果,使用descending=true的查询参数和交换的价值startkey,并endkey在明确的指导书中记载.

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'
Run Code Online (Sandbox Code Playgroud)