CouchDB组级别和密钥范围

时间:2012-02-08 17:50:35

标签: nosql couchdb couchbase

任何人都可以向我解释为什么以下情况不起作用:

假设以下文档结构:

{
   "_id": "520fb089a6cb538b1843cdf3cca39a15",
   "_rev": "2-f96c27d19bf6cb10268d6d1c34799931",
   "type": "nosql",
   "location": "AZ",
   "date": "2012/03/01 00:00:00",
   "amount": 1500
}

一个Map函数定义如下:

function(doc) {
  var saleDate = new Date(doc.date);
  emit([doc.location,saleDate.getFullYear(),saleDate.getMonth()+1],doc.amount);
}

使用内置的_sum函数作为reducer。

执行此操作时(使用group = true),您将得到如下结果:

{"rows":[
{"key":["AZ",2012,2],"value":224},
{"key":["AZ",2012,3],"value":1500},
{"key":["WA",2011,12],"value":1965},
{"key":["WA",2012,1],"value":358}
]}

现在,如果您将查询更改为以下内容:

http://127.0.0.1:5984/default/_design/nosql/_view/nosql_test?group_level=2

你得到这样的结果:

{"rows":[
{"key":["AZ",2012],"value":1724},
{"key":["WA",2011],"value":1965},
{"key":["WA",2012],"value":358}
]}

所以考虑到这一点,如果我想在2011年找到“WA”的所有销售,我不能执行这样的事情:

http://127.0.0.1:5984/default/_design/nosql/_view/nosql_test?group_level=2&key=["WA",2011]

此示例取自NoSQL磁带上的有用视频。

http://nosqltapes.com/video/understanding-mapreduce-with-mike-miller

1 个答案:

答案 0 :(得分:8)

您始终需要提供一系列密钥,因为过滤是在map的结果上完成的,reduce上的不是

例如,以下参数应该有效(如果正确地进行了网址编码):

?group_level=2&startkey=["WA",2011]&endkey=["WA",2011,{}]

您可以阅读view collation了解其运作方式。