2012-10-21 12 views
33

これは尋ねる必要がありますが、文書化されていません。私はモンゴイドORクエリの構文

Username.where(:username=>@username, :email=>@email) 

は、電子メールまたはどちらか(私はORタイプのクエリにそれを変更することができますどのように、ユーザは、(ANDクエリで以下)が存在するかどうかを確認しようとしているhttp://mongoid.org/en/mongoid/docs/querying.html

では言及がありませんユーザー名は一致する必要があります)。

私はオンライン(から)直接JavaScriptを送るなど、いくつかの非常に複雑な方法を発見した:http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

は確かにこれを正しく行うためのシンプルな明確な構文がなければなりませんか?

答えて

35

ええ、これはよく文書化されていました。このお試しください:このページに終わる他人の便宜上

Username.any_of({:username => @username}, 
       {:email => @email}) 
101

を、更新構文はupdated docsを参照してください今

Username.or({username: @username}, {email: @email}) 

です。

+10

スコープ内ではまだ 'any_of'を使用する必要があります。それ以外の場合は構文エラーが発生します。 – aledalgrande

+1

リンクされたリンクは、 '.or'や' any_of'について何も教えてくれません。[こちら](https://github.com/mongodb/mongoid/blob/master/lib/mongoid/criteria/queryable/selectable)を参照してください。 rb)を使って詳細な文書と実装を確認する – silva96

+0

スコープ内でself.orを使うこともできます( 'or'はルビのキーワードなので) – Shiyason

1

はMongoid 5.0で、これは、@ミゲル・サヴィニャーノの応答にタイプミスがあり、私

Username.or({username: @username}.or({email: @email}) 
2

のために動作します。 Stackoverflowによれば、「編集キューがいっぱいです」というのは編集を提出しなかった理由です。

適切な構文:

Username.or({username: @username}).or({email: @email}) 

より簡潔なソリューション:

Username.or({username: @username}, {email: @email}) 

モンゴセレクタはに解決されます:

{"$or"=>[{"username"=>@username}, {"email"=>@email}]} 

私がいたとして、私はこの質問を見つけました"創造のために解決しようとする"または「照会」。

文字列または要素の配列のいずれかと一致する場合は、Mongoの '$ in'セレクタを使用してMongoidクエリを記述する必要があります。

たとえば、特定のユーザー名と電子メールの配列があります。フィールドの少なくとも1つが、ユーザー名または配列内の電子メールのいずれかと一致するすべての結果を返したいとします。

@username = "jess" 
@emails = ["[email protected]", "[email protected]", "[email protected]"] 
User.or({username: ""}, {email: {'$in': @emails}}) 

モンゴセレクタはに解決されます:あなたは、データベース内の3つの電子メールの2でUsersを持っている場合は、セレクタが2

  • の数を返します

    {"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]} 
    
    • Userusername「jess」と3つの追加のUsersがあり、指定された電子メールの1つがある場合、セレクタは4のカウントを返します。それでもwhereメソッドを使用したい場合は
  • 3

    また、Mongoid 5.0で、使用次

    Username.where('$or' => [ { username: @username }, { email: @email } ]) 
    

    あなたは、動的な方法でクエリハッシュの種類を構築しているとき、これは非常に有用であり、 whereメソッドを維持する必要があります