我的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}
我该如何解决?
答案 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 };
}