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

如果只需要单查询key,可以使用如下map:

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["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'

请注意,我使用了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 回答