2010-12-08 4 views

答えて

39

非常に単純かつ一般的な操作でなければなりません - あなたは

User.where(:nickname.in=>["kk","ll"]) 

別の属性を取得している。しかし、私はmongoidでこれを行う方法を疑問に思っている場合は、これを簡単に行うことができます

arr=["id1","id2"] 
User.where(:id=>arr) 

IDは:_idで保存され、:idではないことに注意してください。そこidヘルパーメソッドがあるが、あなたは、クエリを実行するとき、あなたは:_idを使用する必要があります。

しばしば
User.where(:_id.in => arr) 

私はそれが便利な複雑なクエリを実行するIDのリストを取得するために見つけるので、私のような何かを実行します。

user_ids = User.only(:_id).where(:foo => :bar).map(&:_id) 
Post.where(:user_id.in => user_ids) 
+0

ユーザーの量が少ない場合に上記溶液が正常に動作します。しかし、何千人ものユーザーがいる間に多くのメモリが必要になります。 – dpaluy

+0

@dpaluyあなたが正しいです - このアプローチはハックです。また、第1クエリと第2クエリの間でデータが変更される可能性があります。慎重に使用するか、より良い方法を見つけてください。 – bowsersenior

+3

もっと良い方法は、 '.map(&:_ id)'の代わりに '.distinct(:_ id)'を使うことです。 'distinct'は、クエリを実行する際に動作します。これは、配列をループするようにレールに指示するよりも少し速いです。 – Zakwan

4

上記の方法は、browserseniorによって提案されていません、少なくとも私のために、もう動作していないようです。私は何をすることです:

User.criteria.id(arr) 
+3

ちょっとした注意が必要です。 Mongoid 2.0.0以降では、 'id'の代わりに' for_ids'を使う必要があります: 'User.criteria.for_ids(arr)' – bowsersenior

5

それとも単に:ユーザーの量が少ない場合には上記

arr = ['id1', 'id2', 'id3'] 
User.find(arr) 
+1

上記の問題:1つのidだけが見つからない場合は、エラーであり、見つかったIDではありません。 – dman

+0

'Mongoid.raise_not_found_error = false'はドキュメントが見つかりません上記クエリで発生したエラー – r3bo0t

2
user_ids = User.only(:_id).where(:foo => :bar).map(&:_id) 
Post.where(:user_id.in => user_ids) 

ソリューションが正常に動作します。しかし、何千人ものユーザーがいる間に多くのメモリが必要になります。

User.only(:_id).where(:foo => :bar).map(&:_id) 

id以外の各フィールドにnilを持つUserオブジェクトのリストを作成します。

(mongoid 2.5)溶液:

User.collection.master.where(:foo => :bar).to_a.map {|o| o['_id']} 
関連する問題