在MongoDB中使用布尔逻辑时,是否有(唯一)解决方法可以解决重复的“$or”键?

Could there be a (unique) workaround for duplicate "$or" keys when working with boolean logic in MongoDB?

提问人:Owen S 提问时间:11/22/2022 最后编辑:Owen S 更新时间:11/22/2022 访问量:18

问:

当我之前问一个关于MongoDB查询的问题时,解决了相应的问题,但另一个问题源于最初的想法。

在类似条件下,假设我正在尝试查询:

    Example: {
    "AttributeA": type,
    "AttributeB": type,
    "AttributeC": type,
    "AttributeD": type
    etc...
    }

但是我想找到给定条件的所有元素:

(属性 A 与 criteria1 匹配或属性 B 与 criteria2 匹配) 和 (属性 C 与 criteria3 匹配,属性 D 与 criteria4 匹配,或者属性 E 与 criteria5 匹配)

$in运算符仅跟踪$or条件,前提是属性相同(例如,参考前面的 AttributeC 匹配条件 3、4 或 5 的问题)。因此,此新查询中的总体布局将更像:

    db.Example.find({
      $or:[ {AttrA : "criteria1"}, {AttrB : "criteria2"}],
      $or:[ {AttrC : "criteria3"}, {AttrD : "criteria4"}, {AttrE : "criteria5"} ]
    })

但是在上述条件下,如果没有重复的“$or”运算符似乎是不可能的,除非我做一些布尔代数并将其分离为:

((A+B)*(C+D+E) = AC + AD + AE + BC + BD + BE) 又名 AttrA 匹配 ...和 AttrC 匹配...... 或 AttrA 匹配 ...和 AttrD 匹配...... 或 ... AttrB 匹配 ...和 AttrE 匹配......

这意味着格式将如下所示

    db.Example.find({
    $or:[
          $and:[{AttrA : "criteria1"}, {AttrC : "criteria3"}],
          $and:[{AttrA : "criteria1"}, {AttrD : "criteria4"}],
          ...,
          $and:[{AttrB : "criteria2"}, {AttrE : "criteria5"}
        ]
    })

虽然我什至不确定mongoDB系统是否允许重复的“$and”。 有没有更简单的方法,或者我是否使条件查询过于复杂?

mongodb mongodb-query 条件语句布尔 逻辑

评论


答:

0赞 user20042973 11/22/2022 #1

无需在此处手动分发条件。您必须在隐式上使用 显式而不是隐含:$and

db.Example.find({
  $and: [
    { $or:[ {AttrA : "criteria1"}, {AttrB : "criteria2"}] },
    { $or:[ {AttrC : "criteria3"}, {AttrD : "criteria4"}, {AttrE : "criteria5"} ] }
  ]
})

此处的 Playground 示例此处的文档中对此进行了介绍。

遇到的一般问题,至少在包含 shell 的 Javascript 中是这样,是不支持重复的字段名称。请考虑以下示例,直接使用 Node:

$ node
Welcome to Node.js v16.17.0.
Type ".help" for more information.
> let x = { x: 123, y: 456, x: 789 }
undefined
> x
{ x: 789, y: 456 }
>