couchdb映射函数和reduce函数

时间:2013-07-27 10:36:22

标签: mapreduce couchdb

我正在尝试制定地图功能并减少以下情况的功能:

文件:

{
 "_id" : "1_A",
 "key1": 10,
 "key2": 10
}

{
 "_id" : "2_A",
 "key1": 2,
 "key2": 3
}
{
 "_id" : "1_B",
 "key1": 20,
 "key2": 20
}

{
 "_id" : "2_B",
 "key1": 1,
 "key2": 0
}

期望:所有id中的每个键(key1,key2 ... keyn)的总和单独以“_A”,“_ B”......“_ Z”结尾。

在这种情况下,期望有sumA:“key1”:12,“key2”:13。和sumB:“key1”:21,“key2”:20;

我一直在研究地图功能(doc),在我看来,它只是处理一个指定为“doc”值的文档。

无论如何都能达到预期的效果吗?是不是像SQL join ???

1 个答案:

答案 0 :(得分:1)

是的,这是可能的!您必须在此处发出复合键,例如["A", 1],其中key的值为id,其中Afunction (doc) { for (var k in doc) { if (k !== '_id' && k !== 'rev') { emit([doc._id.substr(doc._id.length - 1), k.substr(k.length - 1)], doc[k]); } } } 结尾。

地图示例:

_sum

对于reduce,您希望使用内置函数group=true来提高性能。

然后,您可以使用A作为网址参数查询这些总和,可能会使用startkeyendkey(例如{{}将值限制为仅包含后缀["A"]的值1}}和["A", {}])。

在这种情况下,结果将是:

{"rows":[
    {"key":["A","1"],"value":12},
    {"key":["A","2"],"value":13},
    {"key":["B","1"],"value":21},
    {"key":["B","2"],"value":20}
]}