MongoDB - reduce函数无法正常工作

时间:2016-06-15 09:51:10

标签: mongodb mapreduce aggregation-framework

我的map函数返回键值对,其中key是字段的名称,值是对象{type: <field type>, count : 1}。 例如,假设我有这些文件:

{ 
    "_id" : ObjectId("57611ad6bcc0d7e01be886c8"), 
    "index" : NumberInt(0)
}
{
    "_id" : ObjectId("57611ad6bcc0d7e01be886c9"), 
    "index" : NumberInt(7)
}
{
    "_id" : ObjectId("57611ad6bcc0d7e01be886c7"), 
    "index" : NumberInt(9)
}

我必须检索每个字段的名称,其类型以及我的集合中字段的出现次数。

我的地图功能有效,我得到了:

"_id", [{type:"ObjectId", count:1},{type:"ObjectId", count:1},{type:"ObjectId", count:1}] 
"index",[{type:"number", count:1},{type:"number", count:1},{type:"number", count:1}]

我想删除type中的重复项。

我有以下减少功能:

function (key, stuff) {

reduceVal = {type:"", count:0};
var array = [];

for(var idx =0; idx < stuff.length; idx++) {

  reduceVal.count += stuff[idx].count;

  if(array.indexOf(stuff[idx].type) > -1) {
  array.push(stuff[idx].type);
  }
}

reduceVal.type = array.toString();

if子句不起作用。我的目标是向我的array添加一个元素,只要它不是重复的。 预期产出:

"_id", {type:"ObjectId", count:3}
"index", {type:"number", count:3}

我该如何解决?

2 个答案:

答案 0 :(得分:0)

reduce函数有效。 if语句错误:我必须在我的数组中添加一个元素 if(array.indexOf(stuff[idx].type) === -1)

答案 1 :(得分:-1)

看起来你只是混淆了你的缩减功能。据我所知,你假设reducer被全局调用一次。不是这种情况。相反,它是按键调用的,即减速器的输入类似于:

第一个电话:

key = "ObjectId", val = [{type:"ObjectId", count:1},{type:"ObjectId", count:1},{type:"ObjectId", count:1}]

第二个电话:

key = "number", val = [{type:"number", count:1},...]

因此,您需要总结一下,知道密钥已经设置(此代码未经过测试且会有缺点):

function(key, vals) {
    var sum = 0;
    for(var i = 0; i < vals.length; i++) {
        sum += vals[i].count;
    }
    return { "type" : key, "count" : sum };
}