首页 > 解决方案 > MongoDB $or 运算符分别用于多个字段

问题描述

看起来 MongoDB 仅在查询根中支持 $or 运算符,而不是每个字段查询。所以这不起作用:

db.collection.find({
    foo: {
        $or: [ fooQuery1, fooQuery2 ]
    },
    bar: {
        $or: [ barQuery1, barQuery2 ]
    }
})

所以我们必须这样写:

db.collection.find({
    $or: [
        { foo: fooQuery1, bar: barQuery1 },
        { foo: fooQuery1, bar: barQuery2 },
        { foo: fooQuery2, bar: barQuery1 },
        { foo: fooQuery1, bar: barQuery2 },
    ]
})

foo基本上写出和 的所有可能组合bar。但是,当我们必须通过 >2 个字段和 >2 个 OR 语句进行查询时,这太疯狂了。

编写一个函数非常容易,该函数从第一个示例中获取字段及其 OR 语句,并从第二个示例中生成所有可能的变体。但是是否有一些 MongoDB 本机方法,可能我们在这里遗漏了一些东西。

也许您知道原因,为什么不支持第一种方法?以便我们更好地了解 mongodb 内部结构。

谢谢你。

标签: mongodbmongodb-query

解决方案


可以通过多种方式编写此查询,但这取决于每个查询中包含的实际操作。

如果查询正在检查相等性或正则表达式,则可以使用$in运算符,例如

{
   foo: { $in: [ "fooValue1", /^fooPrefix/ ]},
   bar: { $in: [ "barValue1", "barValue2" ]}
}

如果子查询有其他测试,例如不等式或存在性,您可以将每个字段的查询组合在一个单独的 中$or,并使用一个$and运算符来确保每个查询都匹配,例如:

{$and: [
   {$or: [{foo: fooQuery1}, {foo: fooQuery2}]},
   {$or: [{bar: barQuery1}, {bar: barQuery2}]}
]}

推荐阅读