【问题标题】:How to map/reduce two MongoDB collections如何映射/减少两个 MongoDB 集合
【发布时间】:2011-12-12 22:24:16
【问题描述】:

我是 map / reduce 的新手,并试图找出一种方法来使用 map / reduce 收集以下数据,而不是使用我的(慢)应用程序逻辑:

我有一个集合“项目”,与集合“任务”有 1:n 的关系。现在我想收到一组结果,其中给出了项目名称,其中第一个是任务最多的项目,最后一个是任务最少的项目。

或者更好的哈希数组也告诉我每个项目有多少任务(假设项目名称是唯一的:

[project_1: 23, project_2: 42, project_3: 82]

对于地图,我尝试了类似的方法:

map = function () {
  emit(this.project_id, { count:1 });
}

并减少:

reduce = function (key, values) {
  var sum = 0;
  values.forEach(function(doc){ sum += 1; });
  return { count:sum };
}

我对我的任务集合触发了这个:

var mr = db.tasks.mapReduce(map, reduce, { out: "results" });

但我在查询时得到了重要的结果:

db[mr.result].find();

我在 Rails 上使用 Mongoid,完全迷失了方向。有人能指出我正确的方向吗?

提前谢谢。 费利克斯

【问题讨论】:

    标签: mongodb mongoid mapreduce


    【解决方案1】:

    看起来一般正确,但我发现至少一个问题:reduce 函数中的求和步骤应该是

      values.forEach(function(doc){ sum += doc.count ; });
    

    因为函数可能正在减少本身是先前减少步骤的产物的值,因此计数值 > 1。

    这是一个常见的疏忽,在这里提到:http://www.mongodb.org/display/DOCS/Troubleshooting+MapReduce

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2012-11-11
      相关资源
      最近更新 更多