2

MongoDB map / reduce機能は、MongoIdバージョン2+のMongoidCriteriaでは使用できないという点で正しいですか?

誰かがこれを確認できますか私には基準があります

ここに私のクエリ

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では同じものを見つけることができないので、私は信じていますか?

アプリケーションはRuby-1.8.7で実行されており、mongoid 3にはruby-1.9+が必要なので、mongoidをアップグレードできます(できればいいのですが)。

したがって、map / reduceが、map / reduceを実行する方法の基準で機能しない場合は、他の条件を考慮に入れることができます。 active_performers.order_by([:sort_order,:desc])

注:わかりやすくするために、マップリデュース機能は追加していません

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を実行できます。そして、それをすべてで実行したい場合は、PerformerSource.scoped.map_reduce(..)のように.allまたは.scoped(私が好む)のいずれかを使用します

于 2012-10-17T22:41:13.857 に答える