MongoDB MapReduce在深嵌套文档问题上的应用

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

对于我的Rails+MongoId应用程序,我需要为统计目的聚合数据。 我的模型是一个通用的Web应用程序,它有许多版本(又名:bundle)和相关的用户激活:

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++,添加一个“未定义”检查(如您所建议的),它工作得非常好(我还避免了双循环)

致意 科斯塔先生