我的mongo集合中的文档如下:
{
"_id" : ObjectId("568f7e67676b4ddf133999e8"),
"auth_dic" : {
"2406" : [
"44735"
],
"6410" : [
"223423"
]
...
...
},
"user_id" : "fdasd23423"
}
这是一个用户,在"auth_dic"中有许多类似"2406"6410"的id
我想使用mapreduce方法来统计有多少用户拥有"2406",有多少用户具有"6410",以及其他类型。我的映射器是:
mapper = Code('''
function(){
this.auth_dic.forEach(function(app_id){
emit(app_id, 1);
});
}
''')
我的减速器是:
reducer = Code('''
function(key, values){
var total = 0;
for (var i = 0; i < values.length; i++) {
total += values[i];
}
return total;
}
''')
但是映射器不能工作,因为函数"forEach"不能使用户迭代dic,我该怎么办才能解决这个问题?
运行以下MapReduce操作:
mr = db.runCommand({
"mapreduce" : "collectionName",
"map" : function() {
var map = this.auth_dic;
for (var key in map) {
if (map.hasOwnProperty(key)) { emit(key, 1); }
}
},
"reduce" : function(key, val) { return Array.sum(val); },
"out": "collectionName" + "_keys"
})
然后查询得到的集合,以便找到动态密钥的所有计数:
db[mr.result].find()