MongoDB MapReduce在深嵌套文档问题上的应用
对于我的Rails+MongoId应用程序,我需要为统计目的聚合数据。 我的模型是一个通用的Web应用程序,它有许多版本(又名:bundle)和相关的用户激活:MongoDB MapReduce在深嵌套文档问题上的应用,mongodb,mapreduce,mongoid,Mongodb,Mapreduce,Mongoid,对于我的Rails+MongoId应用程序,我需要为统计目的聚合数据。 我的模型是一个通用的Web应用程序,它有许多版本(又名:bundle)和相关的用户激活: App = { "_id" : ObjectId("4ff2e2eab528571384000eb4"), "name" : "my app", "category_id": "4ff2e2eab528571384000cc0", "bundles": [{ "_id" : ObjectId("4ff2e2eab
App = {
"_id" : ObjectId("4ff2e2eab528571384000eb4"),
"name" : "my app",
"category_id": "4ff2e2eab528571384000cc0",
"bundles": [{
"_id" : ObjectId("4ff2e2eab528571384000dca"),
"activations" : [{
"user" : "user_0",
"_id" : ObjectId("4ff2e2eab528571384000dd0")
},
...
},
...
]
}
现在,我要做的是返回每个应用程序类别的激活次数,alá:
results = [
{
"_id": "4ff2e2eab528571384000cc0",
"value": 243
},
...
]
使用此mapreduce函数,我可以很容易地获得每个CATEGORY_ID的捆绑包总数:
map = function() {
for (var bundle in this.bundles) {
emit(this.category_id, 1);
}
};
reduce = function(key, values) {
var sum = 0;
values.forEach(function(value) {
sum += value;
});
return sum;
};
但是,当我试图进入更深一层时,我没有得到任何结果:
map = function() {
for (var bundle in this.bundles) {
for (var activation in bundle.activations) {
emit(this.category_id, 1);
}
}
};
reduce = function(key, values) {
var sum = 0;
values.forEach(function(value) {
sum += value;
});
return sum;
};
任何想法都非常感谢。致意
Mike Costa您确定map reduce函数运行正确吗 我想你应该检查bundle.activations是否为非空。 检查服务器日志中是否有任何错误。
您还可以使用服务器日志查看调试打印语句。感谢您提供的提示 我可以通过修改map函数来解决我的问题,如下所示:
map = function() {
var len = this.bundles.length;
for (var i = 0; i < len; i++) {
if (this.bundles[i].activations !== undefined) {
emit(this.category_id, this.bundles[i].activations.length);
}
}
};
map=function(){
var len=this.bundles.length;
对于(变量i=0;i
我不得不删除for..in construct,改为更传统的for..I++,添加一个“未定义”检查(如您所建议的),它工作得非常好(我还避免了双循环)
致意
科斯塔先生