Mongoid OR查询语法

时间:2012-10-21 15:44:49

标签: ruby-on-rails mongoid

这必须要求很多,但记录很差。 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

当然,必须有一个简单明了的语法来正确地执行此操作吗?

5 个答案:

答案 0 :(得分:114)

为了结束此页面的其他人,现在更新语法

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

请参阅updated docsrelevant impl

答案 1 :(得分:48)

是的,这曾经被证明更好。试试这个:

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

答案 2 :(得分:5)

@ miguel-savignano的回复中有一个错字。根据Stackoverflow,"编辑队列已满#34;这就是我没有提交编辑的原因。

正确的语法:

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"]}}]}
  • 如果您的数据库中有3封电子邮件中有2封Users,则选择器将返回2个。
  • 如果你有User username" jess"另外3个Users每个都有一个给定的电子邮件,然后选择器将返回4个。

答案 3 :(得分:5)

此外,在Mongoid 5.0中,如果您仍想使用where方法,请使用以下

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

当您以动态方式构建一种查询哈希并且需要保留where方法

时,这非常有用

答案 4 :(得分:2)

在Mongoid 5.0中,这对我有用

{{1}}