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

Understanding the usage of map/reduce functions in couchdb

我的映射函数后有以下输出键值对。

["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 函数适用于 every unique key ,没有分组的结果不应该像下面这样吗?

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

使用 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 在 select 级别对要分组的键中的值的精确数量进行分组。这通常在处理时间序列类型数据时使用,以便能够按年、按月或按天进行分组。这在以下博客中有深入解释-post:

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