【问题标题】:MongoDB $or queryMongoDB $或查询
【发布时间】:2017-07-19 03:38:16
【问题描述】:

我在 mongo shell 中运行以下查询:

db.Profiles.find ( { $or : [ { "name" : "gary" }, {"name":"rob} ] } )

它只是没有按预期返回(JSON)?

【问题讨论】:

  • 注意,语法错误,上面这个问题的初始问题,后来通过编辑得到了corrected
  • 我已恢复该编辑,将 OP 的原始问题之一编辑为不可能的问题。

标签: mongodb mongodb-shell


【解决方案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 将起作用 - 警惕依赖无法索引的查询 - 适当地使用 ensureIndexprofile 数据库来识别慢速查询(或在单个查询上使用 explain)。否则随着时间的推移,事情会变得缓慢或不再可行。
  • 注意,有人corrected 上面问题中的语法。以防万一你盯着它看,不明白哪里出了问题。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2022-10-05
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多