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

时间:2012-01-19 10:52:23

标签: javascript couchdb couchrest

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

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

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

谢谢

1 个答案:

答案 0 :(得分:7)

如果您只需要通过单个key进行查询,则可以使用以下地图:

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

并使用"KEY"查询?startkey=["KEY"]&endkey=["KEY",{}]&include_docs=true

根据collation specification of CouchDB

  • ["KEY"]的值小于任何["KEY","OTHER"]值(因为较长的数组在其前缀后排序),但大于["KEY2","OTHER"]的任何"KEY2" < "KEY";
  • ["KEY",{}]是一个大于任何["KEY","OTHER"]值的值,如果doc.otherkey永远不是JSON对象(因为JSON对象位于任何其他JSON值之后) ),但小于任何["KEY2","OTHER"] "KEY2" > "KEY"

当然,这并不仅限于字符串。只要整理正确,任何类型的值都可以使用。

请记住对startkeyendkey中的值进行网址编码。例如,使用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 documentation

要按降序对结果进行排序,请使用descending=true查询参数,并将startkeyendkey的值换为documented in the definitive guide book

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'