【问题标题】:Mongo array query with $and, $or [duplicate]Mongodb数组查询与$and,$or [重复]
【发布时间】:2018-10-24 01:13:49
【问题描述】:

查询数组时是否可以使用$and$or逻辑运算符?

因为当我创建一个包含 2 个文档的集合时

db.inventory.insertMany([
  { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 25 ] },
  { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 50 ] }
]);

查询

db.inventory.find( { dim_cm: {$or: [ {$gt: 49}, {$size: 1} ] }  }  )

结果是错误unknown operator $or

我可以将查询重写为

db.inventory.find( { $or: [{dim_cm: {$gt: 49}}, {dim_cm: {$size: 1}}] } )

但为什么第一个查询变体无效?

【问题讨论】:

  • 它无效,因为这不是在 MongoDB 中使用 $or 聚合运算符的正确语法。只要使用正确的语法,就可以同时使用$and$or 运算符。例如,您可以将 2 个 $or 语句放在 $and 内。
  • 因为它无效并且文档清楚地说明了它。 $or 不适用于“字段”,而是“查询条件列表”,“任一”可以作为匹配项应用。因此,为什么它是一个数组。您可以使用$in 来“速记”简单值,即dim_cm: { $in: [10,25] } 选择两个匹配的文档。但是“其他表达式”需要数组。老实说,documentation $or is pretty clear.
  • 我仍然不完全清楚的是文档中使用的 expressionquery 之间的区别。因为如果我使用$or 结果是查询?所以我可以在$elemMatch 中使用$or,因为它需要一个查询

标签: mongodb


【解决方案1】:

$or 运算符对两个或多个数组执行逻辑或运算,并选择至少满足 . $or 的语法如下:

在第一个查询中,您尝试在 or 运算符之前查找 dim_cm。这在纯文本中清楚地表明“查找 dim_cm 或 gt 49,数组的大小 1”。

而在第二个查询中,它清楚地表明您正在尝试在大于 49、数组大小为 1 之间查找 dim_cm

欲了解更多信息Check here

【讨论】:

  • OP 的查询中没有“和”逻辑。使用的语法不正确,它们本质上说的是同一件事,但第二个查询是正确的语法。第二个查询真正说的是“查找所有 dim_cm 大于 49 的文档, dim_cm 的大小为 1。
  • @EvanBechtol 在尝试简要解释时,我输入错误。更正了我的答案。
猜你喜欢
  • 2017-08-11
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
相关资源
最近更新 更多