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

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

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

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

谢谢

最佳答案
如果您只需要通过单个键进行查询,则可以使用以下映射:

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

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

在这里,根据collation specification of CouchDB

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

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

请记住对startkey和endkey中的值进行URL编码.例如,使用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查询参数,并将startkey和endkey的值交换为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'

转载注明原文:javascript – Couch DB按键过滤并按其他字段排序 - 代码日志