带2个密钥的CouchDB视图

时间:2012-06-04 19:47:31

标签: map views couchdb mapreduce

我正在寻找有关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]

我的任务是:如何选择身份在2到4之间的所有行?

2 个答案:

答案 0 :(得分:2)

您可以尝试扩展上面的解决方案,但是在键前加上一个“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]

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

答案 1 :(得分: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 View Collation

查看排序规则