我是否正确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])
注意:为了清楚起见,我没有添加地图和减少功能
答案 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(..)