了解couchdb中map / reduce函数的用法

时间:2018-01-24 08:24:39

标签: nosql couchdb

我的map函数后面有以下输出键值对。

["hello"] => 12
["hello"] => 1
["world"] => 23
["world"] => 4
["canada"] => 18

当我使用 __ count 作为reduce函数时,我得到结果5 ,如下所示。 系统计算每一行。

{
    "rows": [
        {
            "key": null,
            "value": 5
        }
    ]
}

我再次使用与 __ count 相同的地图功能。这次我将 group = true 添加到查询中。我得到以下结果。似乎reduce函数适用于每个分组键,并将其自身计算。

["hello"] => 2
["world"] => 2
["canada"] => 1

我无法理解这里的机制。为什么系统在分组和不分组的情况下都能正常工作。如果reduce功能适用于每个唯一键,那么在没有分组的情况下,结果是否应该如下所示?

["hello"] => 1
["hello"] => 1
["world"] => 1
["world"] => 1
["canada"] => 1

1 个答案:

答案 0 :(得分:0)

使用reduce=true&group=false_count reduce函数,您要求系统计算索引中的条目总数。因此,在您的情况下,您会看到5的预期结果。

group=true是仅在每个密钥级别应用reduce函数的请求,而不是对所有条目进行最终求和。正如您所看到的,如果您对group=true案例中得到的值求和,最终会得到group=false案例的值:2 + 2 + 1 = 5.

如果你发出一个向量值的键,它会变得更加复杂,例如,你的地图上写的内容是

emit([doc.field1, doc.field2, doc.field3], 1)

然后,您可以使用group_level=X在要分组的键的精确数量值的选​​择级别进行分组。这通常在处理时间序列类型数据时使用,以便能够每年或每月或每天进行分组。这在以下博客文章中有详细解释:

https://console.bluemix.net/docs/services/Cloudant/blog/mapreduce.html