45

これは多くの人に尋ねる必要がありますが、文書化は非常に不十分です。http://mongoid.org/en/mongoid/docs/querying.htmlには言及がありません

ユーザーが存在するかどうかを確認しようとしています(以下はANDクエリです)。ORタイプクエリに変更するにはどうすればよいですか。

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

(電子メールまたはユーザー名のいずれかが一致する必要があります)。

直接javascriptを送信するなど、オンラインでかなり複雑な方法をいくつか見つけました:http: //omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

確かに、これを正しく行うには、単純で明確な構文が必要ですか?

4

5 に答える 5

121

このページにたどり着く他の人のために、更新された構文は現在

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

更新されたドキュメントまたは関連するimplを参照してください。

于 2013-07-19T13:43:36.320 に答える
51

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

Username.any_of({:username => @username},
                {:email => @email})
于 2012-10-21T15:56:58.213 に答える
9

@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 = ["hi@mail.com", "test@mail.com", "foo@mail.com"]
User.or({username: ""}, {email: {'$in': @emails}})

Mongoセレクターは次のように解決されます。

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["hi@mail.com", "test@mail.com", "foo@mail.com"]}}]}
  • データベースに3つの電子メールのうち2つがある場合Users、セレクターは2のカウントを返します。
  • 「jess」を含むaUserと、指定された電子メールの1つを含む3つの追加がある場合、セレクターは4のカウントを返します。usernameUsers
于 2017-04-28T02:15:22.940 に答える
9

また、Mongoid 5.0では、このwhereメソッドを引き続き使用する場合は、次を使用します。

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

whereこれは、ある種のクエリハッシュを動的に構築していて、メソッドを維持する必要がある場合に非常に便利です。

于 2017-08-22T00:50:09.743 に答える
4

Mongoid 5.0では、これは私のために機能します

Username.or({username: @username}).or({email: @email})
于 2016-09-14T09:36:37.537 に答える