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 - 查询难题 - 文档参考或子文档

MongoDB - 查询难题 - 文档参考或子文档

MongoDB:运行更快的查询,这更好 Pymongo 或 MongoEngine

mongodb查询操作分析

如何使用 Mongodb 或 Mongoose 查询并使用 javascript 打印?

MongoDB 巨大的文档或多个查询