これはたくさん尋ねられる必要がありますが、それは非常に不十分に文書化されています。 http://mongoid.org/en/mongoid/docs/querying.html には言及がありません
ユーザーが存在するかどうかを確認しようとしています(以下はANDクエリです)。これをOR
タイプのクエリに変更するにはどうすればよいですか。
Username.where(:username=>@username, :email=>@email)
(電子メールまたはユーザー名が一致する必要があります)。
直接javascript(from)を送信するなど、かなり複雑な方法をオンラインで見つけました: http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid
これを正しく行うには、単純で明確な構文があるはずです。
ええ、これは以前よりよく文書化されていました。これを試して:
Username.any_of({:username => @username},
{:email => @email})
このページにたどり着く人のために、更新された構文は今です
Username.or({username: @username}, {email: @email})
pdated docs または relevant impl を参照してください。
また、Mongoid 5.0では、where
メソッドを引き続き使用する場合は、以下を使用します
Username.where('$or' => [ { username: @username }, { email: @email } ])
これは、動的な方法で一種のクエリハッシュを構築していて、where
メソッドを保持する必要がある場合に非常に役立ちます。
@ miguel-savignanoの応答にタイプミスがあります。 Stackoverflowによると、「編集キューがいっぱいです」、それが私が編集を送信しなかった理由です。
適切な構文:
Username.or({username: @username}).or({email: @email})
より簡潔なソリューション:
Username.or({username: @username}, {email: @email})
Mongoセレクターは次のように解決されます。
{"$or"=>[{"username"=>@username}, {"email"=>@email}]}
「または」クエリを作成するために解決しようとしていたときに、この質問を見つけました。
文字列または要素の配列のいずれかと一致させる場合は、Mongo '$ in'セレクターを使用してMongoidクエリを作成する必要があります。
たとえば、特定のユーザー名と一連の電子メールがあるとします。少なくとも1つのフィールドが配列内のユーザー名または電子メールの1つと一致するすべての結果を返したいとします。
@username = "jess"
@emails = ["[email protected]", "[email protected]", "[email protected]"]
User.or({username: ""}, {email: {'$in': @emails}})
Mongoセレクターは次のように解決されます。
{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]}
Users
である場合、セレクターは2のカウントを返します。User
にusername
"jess"があり、さらに3つのUsers
があり、それぞれに特定の電子メールが1つある場合、セレクターは4のカウントを返します。Mongoid 5.0では、これでうまくいきます
Username.or({username: @username}).or({email: @email})