我正在尝试为以下情况计算map函数和reduce函数:
文档:
{
"_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;
我一直在研究map函数(doc),在我看来,它一次只处理一个指定为"doc"值的文档。
有没有办法达到预期的结果?还有类似SQL联接的吗???
是的,这是可能的!您必须在这里发出一个复合键,如下所示:["A", 1]
表示文档中key
的值,id
以A
结尾。
地图示例:
function (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]);
}
}
}
对于reduce,您希望使用内置函数_sum
来提高性能。
然后,您可以使用group=true
作为URL参数来查询这些和,通过使用startkey
和endkey
(例如["A"]
和["A", {}]
),可能会将值限制为仅后缀为A
的值。
在这种情况下,结果将是:
{"rows":[
{"key":["A","1"],"value":12},
{"key":["A","2"],"value":13},
{"key":["B","1"],"value":21},
{"key":["B","2"],"value":20}
]}