Mongoid OR 查询语法

Posted

技术标签:

【中文标题】Mongoid OR 查询语法【英文标题】:Mongoid OR query syntax 【发布时间】:2012-10-11 13:13:05 【问题描述】:

这必须被问到很多,但它的文档记录很差。 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

确实必须有一个简单明了的语法才能正确执行此操作吗?

【问题讨论】:

【参考方案1】:

是的,这曾经被更好地记录在案。试试这个:

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

【讨论】:

【参考方案2】:

为了其他最终访问此页面的人,更新的语法现在是

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

请参考updated docs或relevant impl。

【讨论】:

在作用域中你仍然必须使用any_of 否则会抛出语法错误。 发布的链接没有说明.orany_of,请参考here 以查看详细文档和实现 你也可以在作用域中使用self.or(因为or是ruby中的关键字)【参考方案3】:

在 Mongoid 5.0 中,这对我有用

Username.or(username: @username).or(email: @email)

【讨论】:

【参考方案4】:

@miguel-savignano 的回复中有错字。根据 *** 的“编辑队列已满”,这就是我没有提交编辑的原因。

正确的语法:

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。 如果您有一个带有username“jess”的User 和另外3 个带有给定电子邮件之一的Users,那么选择器将返回计数4。

【讨论】:

【参考方案5】:

另外,在 Mongoid 5.0 中,如果你还想使用where 方法,请使用以下

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

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

【讨论】:

以上是关于Mongoid OR 查询语法的主要内容,如果未能解决你的问题,请参考以下文章

请按语法排序 Mongoid Scope

查询 Mongoid 哈希字段

Mongoid 不在查询中

关联模型上的 Mongoid 2d 查询

Mongoid / Mongodb 和查询嵌入文档

MongoDB对HABTM关系(Mongoid,RoR)的条件聚合查询?