在版本2中对Mongoid Criteria进行Map / Reduce操作

时间:2012-10-15 06:43:25

标签: mongodb mapreduce mongoid

我是否正确MongoDB map / reduce功能不适用于MongoId版本2的Mongoid Criteria +

任何人都可以确认我有一个标准

这是我的查询

class PerformerSource
  scope :active_performers,where(:active => true).only([:performer_id, :sort_order,:stage_name, :photo, :large_photo, :status, :current_performance_type,:current_sign_in_at])
end

PerformerSource.active_performers.order_by([:sort_order,:desc])

我想将map / reduce功能应用到它

类似这样的事情

PerformerSource.active_performers.order_by([:sort_order,:desc]).map_reduce(PerformerSource.map,PerformerSource.reduce)

但每当我这样做时,它会返回错误

NoMethodError:#的未定义方法`map_reduce'

检查地图/缩小是否可用

PerformerSource.active_performers.order_by([:sort_order,:desc]).respond_to?(:map_reduce)
=> false

PerformerSource.respond_to?(:map_reduce)
=> false

因为我看到Mongoid-3提供了在here上添加Mongoid-criteria中的map / reduce但在mongoid 2中找不到相同的内容,所以我的相信是正确的。

我可以升级mongoid(我希望我能)因为应用程序在Ruby-1.8.7上运行而且mongoid 3需要ruby-1.9 +

那么,如果map / reduce不会对标准如何运行map / reduce然后考虑其他条件,那么可以让我 active_performers.order_by([:sort_order,:desc])

注意:为了清楚起见,我没有添加地图减少功能

1 个答案:

答案 0 :(得分:2)

我制作了以下猴子补丁,我正在制作中使用它:


module Mongoid

  module Criterion #:nodoc:
    module MapReduce
      def map_reduce(map, reduce, options = {})
        opts = {:out => {:inline => 1}, :raw => true, :query => selector}.merge(options)
        klass.collection.map_reduce(map, reduce, opts)
      end
      alias :mapreduce :map_reduce
    end
  end

end

这样我可以在条件上执行map-reduce。如果你想在 all 上执行它,那么要么使用.all或.scoped(我更喜欢),比如PerformerSource.scoped.map_reduce(..)