2011-12-09 14 views
2

私はMongoidマッパーを使用した私のレールアプリケーションでMongoDBを使用します。しかし、私は質問のfinderscriteriaを理解していません。セクションFindersでmongoid documentaionの例では、クエリModel.allですが、私は使用している場合、その結果、コンソールの復帰条件(例えば、User.all用)とない:Mongoファインダーと基準

=> #<Mongoid::Criteria 
    selector: {}, 
    options: {}, 
    class: User, 
    embedded: false> 

しかし、私はファインダーModel.firstまたはModel.last、特定のコンソールリターンを使用している場合結果。 (User.firstのフィールドを持つ特定のユーザーを:email,:usernameなどと返す)。なぜModel.allfindersと書かれていますか?そして、私が必要とするならば、私はすべてUsersか、例えばPostsを得る必要がありますか?

答えて

9

基準オブジェクトを配列として扱うことができます。 Findersは基準がモンゴイドで連鎖可能であるため、基準オブジェクトを返します。それはあなたのような何かを行うことができ、次のとおりです。

users = User.where(:activated => true) 
users = users.where(:created_at.gte => Time.now - 1.week) unless params[:recent].blank? 
users = users.where(:gender => params[:gender].downcase) if %w[m f].include?(params[:gender].downcase 

いつでもあなたはCriteriaで定義されていない任意のメソッドを使用し、実際にクエリを実行し、結果を取得し、配列として扱いますmongoid。特に結果が配列として返されるようにする場合は、いつでもUser.all.to_aを呼び出すことができます。しかし、次の二つが主に同等であることに注意してください:

User.all.each {|u| puts u.id} 
User.all.to_a.each {|u| puts u.id} 

をしかし、その後で1問題があると、それは一旦メモリ内のすべてのドキュメントを取得し、メモリ消費量のあまりにつながることができます。ただし、最初にMongodbカーソルを使用してカーソルを移動させると、制御されたメモリ使用量が得られます。

+0

良い説明。 –

+0

絶対に同意してください!説明をありがとう。 – Eugene

+0

感謝の言葉ありがとう – apneadiving