2

我正在寻找针对 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 之间的所有行?

4

2 回答 2

2

您可以尝试扩展上面的解决方案,但在键前添加一种“发射索引”标志,如下所示:

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]

但无论如何,两种不同的观点会更好。

于 2012-06-11T18:26:43.110 回答
1

不久前我遇到了同样的问题,所以我将解释我的解决方案。在任何地图函数内部,您都可以进行多次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 查看排序规则查看排序规则

于 2012-06-05T19:31:25.640 回答