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 查询。

例如,您有一个特定的用户名和一组电子邮件。您希望返回至少有一个字段与数组中的用户名或电子邮件之一匹配的所有结果。

@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"]}}]}
  • 如果您Users的数据库中有 3 封电子邮件中有 2 封,则选择器将返回计数 2。
  • 如果您有一个User带有username“jess”的邮件,另外还有 3Users个带有给定电子邮件的邮件,那么选择器将返回 4 个计数。
于 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 回答