MongoDB $或查询
Posted
技术标签:
【中文标题】MongoDB $或查询【英文标题】:MongoDB $or query 【发布时间】:2017-07-19 03:38:16 【问题描述】:我在 mongo shell 中运行以下查询:
db.Profiles.find ( $or : [ "name" : "gary" , "name":"rob ] )
它只是没有按预期返回(JSON)?
【问题讨论】:
注意,语法错误,上面这个问题的初始问题,后来通过编辑得到了corrected。 我已恢复该编辑,将 OP 的原始问题之一编辑为不可能的问题。 【参考方案1】:使用 $in
对于问题中的查询,使用$in比较合适
db.Profiles.find ( "name" : $in: ["gary", "rob"] );
为什么不行
缺少引用 - cli 正在等待您完成 or 的第二部分:
db.Profiles.find ( $or : [ "name" : "gary" , "name":"rob ] )
..............................................................^
您需要充分完成查询,以便 cli 对其进行解析,然后说存在语法错误。
不区分大小写的匹配
如评论所示,如果您想以不区分大小写的方式进行搜索,那么您可以使用 $or
和 $regex:
db.Profiles.find ( $or : [ "name" : /^gary/i , "name": /^rob/i ] )
或者,您只需使用一个正则表达式:
db.Profiles.find ( "name" : /^(gary|rob)/i )
但是,不以固定字符串开头的正则表达式查询不能使用索引(它不能使用索引并有效地执行“从这里开始直到找不到匹配项然后保释”),因此是次优的。如果这是您的要求,最好存储一个规范化的名称字段(例如 name_lc
- 小写名称)并对其进行查询:
db.Profiles.find ( "name_lc" : $in: ["gary", "rob"] );
【讨论】:
哇,大错特错。谢谢@AD7six 您建议的查询效果更好。如果说名称在数组中大写,我是否需要更改任何语法?例如名称:[“加里”,“抢劫”] db.Profiles.find ( "names" : $in: [/gary/i, /rob/i] ) 回答了我自己的问题。 @Fruitful 将起作用 - 警惕依赖无法索引的查询 - 适当地使用 ensureIndex 和 profile 数据库来识别慢速查询(或在单个查询上使用 explain)。否则随着时间的推移,事情会变得缓慢或不再可行。 注意,有人corrected 上面问题中的语法。以防万一你盯着它看,不明白哪里出了问题。以上是关于MongoDB $或查询的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB:运行更快的查询,这更好 Pymongo 或 MongoEngine