2

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”用于#

检查 map/reduce 是否可用

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

PerformerSource.respond_to?(:map_reduce)
=> false

所以我相信我是正确的,因为我看到 Mongoid-3 在这里提供了在 Mongoid-criteria 中添加 map/reduce 的规定,但在 mongoid 2 中找不到相同的

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

因此,如果地图/归约不能按照标准运行地图/归约,那么可以让我考虑如何运行地图/归约,然后考虑其他条件,即 active_performers.order_by([:sort_order,:desc])

注意:我只是为了清楚起见没有添加mapreduce功能

4

1 回答 1

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(..)

于 2012-10-17T22:41:13.857 回答