具有 2 个键的 CouchDB 视图



我正在寻找解决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 视图排序规则中查看排序规则

相关内容

  • 没有找到相关文章

最新更新