在couchdb中,我需要按键过滤,这样就完成了。
{
"_id": "_design/test",
"_rev": "6-cef7048c4fadf0daa67005fefe",
"language": "javascript",
"views": {
"all": {
"map": "function(doc) { if (doc.blogId) {emit(doc.key, doc);} }"
}
}
}
但是结果应该由另一个键(doc.anotherkey)排序。因此,如何使用相同的功能,如何通过另一个键实现过滤和排序。
谢谢
答案 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"
。当然,这并不仅限于字符串。只要整理正确,任何类型的值都可以使用。
请记住对startkey
和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 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'