我正在寻找解决couchdb视图问题的通用解决方案。
例如,具有如下所示的视图结果:
{"total_rows":4,"offset":0,"rows":[
{"id":"1","key":["imported","1"],"value":null},
{"id":"2","key":["imported","2"],"value":null},
{"id":"3","key":["imported","3"],"value":null},
{"id":"4","key":["mapped","4"],"value":null},
{"id":"5,"key":["mapped","5"],"value":null}
]
1)如果我只想选择"导入"的文档,我会使用这个:
view?startkey=["imported"]&endkey=["imported",{}]
2)如果我想选择所有具有更高id的导入文档,则2:
view?startkey=["imported",2]&endkey=["imported",{}]
3)如果我想选择ID在2到4之间的所有导入文档:
view?startkey=["imported",2]&endkey=["imported",4]
我的任务是:如何选择 id 介于 2 和 4 之间的所有行?
您可以尝试扩展上述解决方案,但在键前面加上一种"emit index"标志,如下所示:
map: function (doc) {
emit ([0, doc.number, doc.category]); // direct order
emit ([1, doc.category, doc.number]); // reverse order
}
因此,您将能够通过以下方式请求它们
view?startkey=[0, 2]&endkey=[0, 4, {}]
或
view?startkey=[1, 'imported', 2]&endkey=[1, 'imported', 4]
但无论如何,两种不同的观点会更好。
不久前我遇到了同样的问题,所以我会解释我的解决方案。在任何映射函数中,您都可以进行多次emit()
调用。在您的情况下,地图函数可能如下所示:
function(doc) {
emit([doc.number, doc.category], null);
emit([doc.category, doc.number], null);
}
您还可以使用?include_docs=true
从任何查询中取回文档。然后,您返回第 2 行到第 4 行的查询将是
view?startkey=[2]&endkey=[4,{}]
您可以在 CouchDB 视图排序规则中查看排序规则