【问题标题】:Run map/reduce on MongoDb collection with conditions使用条件在 MongoDb 集合上运行 map/reduce
【发布时间】:2011-12-14 00:57:56
【问题描述】:

我对map/reduce的理解似乎不够。我想知道我是否可以从集合中选择一个文档子集并仅在该子集上运行我的 map 和 reduce 函数。

一般来说可以吗?

如果不是,这意味着所有过滤都必须在发射之前在 map 函数中完成。我已经为我的用例写了一张这样的地图:

map = <<-EOF
  function(){
    Array.prototype.contains = function(obj) {
      var i = this.length;
      while (i--) {
        if (this[i] === obj) {
          return true;
        }
      }
      return false;
    };

    project_ids = ['#{@project_ids.map{|pid| pid.to_s}.join('\',\'')}'];

    if(project_ids.contains(this.project_id.toString())) {
      if(this.time.getFullYear() == '#{@year}' && this.time.getMonth() == '#{@month.to_i - 1}') {
        emit(
          this.time.getDate(),
          {
            foos: this.stats.foos
          }
        );
      }
    }
  };
EOF

这是 Rails 项目的一部分,使用 map / reduce 实现的方法实际上比纯 ruby​​ 方法慢 3 倍。

所以我想知道是否有可能首先应用一些条件过滤我的记录集,然后通过 map/reduce 运行记录子集以获取我的数据。

有人能告诉我吗? 提前谢谢 费利克斯

【问题讨论】:

    标签: ruby-on-rails mongodb mapreduce


    【解决方案1】:

    如果您使用的是 ORM,那么您通常可以从作用域集合中获取选择器并在 map-reduce 中使用它,例如与 Mongoid:

    scoped = Project.active.this_year
    Project.collection.map_reduce( ..., :query => scoped.selector)
    

    【讨论】:

      【解决方案2】:

      有。 map/reduce 函数的参数之一是“查询”,它完全可以满足您的需要。详情请查看http://www.mongodb.org/display/DOCS/MapReduce

      【讨论】:

      • 雷蒙,非常感谢。实际上,这正是我想要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多