web-dev-qa-db-ja.com

モンゴイドORクエリ構文

これはたくさん尋ねられる必要がありますが、それは非常に不十分に文書化されています。 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

これを正しく行うには、単純で明確な構文があるはずです。

43
Akshat

ええ、これは以前よりよく文書化されていました。これを試して:

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

このページにたどり着く人のために、更新された構文は今です

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

pdated docs または relevant impl を参照してください。

117
James Lim

また、Mongoid 5.0では、whereメソッドを引き続き使用する場合は、以下を使用します

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

これは、動的な方法で一種のクエリハッシュを構築していて、whereメソッドを保持する必要がある場合に非常に役立ちます。

7
Johan Tique

@ 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]"]}}]}
  • データベースに3つの電子メールのうち2つがUsersである場合、セレクターは2のカウントを返します。
  • Userusername "jess"があり、さらに3つのUsersがあり、それぞれに特定の電子メールが1つある場合、セレクターは4のカウントを返します。
6
Laura

Mongoid 5.0では、これでうまくいきます

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