Mongoid OR查询语法

Aks*_*hat 42 ruby-on-rails mongoid

这必须要求很多,但记录很差.http://mongoid.org/en/mongoid/docs/querying.html没有提及

我正在尝试检查用户是否存在(下面是AND查询),如何将其更改为OR类型查询

Username.where(:username=>@username, :email=>@email)
Run Code Online (Sandbox Code Playgroud)

(电子邮件或用户名必须匹配).

我在网上发现了一些非常复杂的方法,包括发送直接的javascript(来自):http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

当然必须有一个简单明确的语法来正确地做到这一点?

Jam*_*Lim 114

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

Username.or({username: @username}, {email: @email})
Run Code Online (Sandbox Code Playgroud)

请参阅更新的文档相关的impl.

  • 在范围内,您仍然必须使用`any_of`否则会引发语法错误. (10认同)

Ser*_*sev 48

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

Username.any_of({:username => @username},
                {:email => @email})
Run Code Online (Sandbox Code Playgroud)


mig*_*ano 7

在 Mongoid 5.0 中,这对我有用

Username.or({username: @username}).or({email: @email})
Run Code Online (Sandbox Code Playgroud)


小智 5

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

正确的语法:

Username.or({username: @username}).or({email: @email})
Run Code Online (Sandbox Code Playgroud)

更简洁的解决方案:

Username.or({username: @username}, {email: @email})
Run Code Online (Sandbox Code Playgroud)

Mongo选择器将解析为:

{"$or"=>[{"username"=>@username}, {"email"=>@email}]}
Run Code Online (Sandbox Code Playgroud)

当我试图解决创建"或"查询时,我发现了这个问题.

如果您希望匹配字符串或任何一个元素,那么您将需要使用Mongo'$ in'选择器编写Mongoid查询.

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

@username = "jess"
@emails = ["hi@mail.com", "test@mail.com", "foo@mail.com"]
User.or({username: ""}, {email: {'$in': @emails}})
Run Code Online (Sandbox Code Playgroud)

Mongo选择器将解析为:

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["hi@mail.com", "test@mail.com", "foo@mail.com"]}}]}
Run Code Online (Sandbox Code Playgroud)
  • 如果您Users的数据库中有3封电子邮件中的2封,则选择器将返回2的计数.
  • 如果你有一个Userusername"杰斯"和3个额外的Users每一个给定的电子邮件中的一个,然后选择将返回4计数.


小智 5

另外,在Mongoid 5.0中,如果仍要使用该where方法,请使用以下命令

Username.where('$or' => [ { username: @username }, { email: @email } ])
Run Code Online (Sandbox Code Playgroud)

当您以动态方式构建一种查询哈希并且需要保留该where方法时,这非常有用