mongodb - 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 内部结构。
谢谢你。
解决方案
可以通过多种方式编写此查询,但这取决于每个查询中包含的实际操作。
如果查询正在检查相等性或正则表达式,则可以使用$in运算符,例如
{
foo: { $in: [ "fooValue1", /^fooPrefix/ ]},
bar: { $in: [ "barValue1", "barValue2" ]}
}
如果子查询有其他测试,例如不等式或存在性,您可以将每个字段的查询组合在一个单独的 中$or
,并使用一个$and
运算符来确保每个查询都匹配,例如:
{$and: [
{$or: [{foo: fooQuery1}, {foo: fooQuery2}]},
{$or: [{bar: barQuery1}, {bar: barQuery2}]}
]}
推荐阅读
- python - Pyglet - 一次移动多个形状
- python - 通过有条件地将值传递给 iloc 子集数据帧
- c# - 不区分大小写的排序不起作用(.NET Core、EF)
- pandas - 如何使用 pyarrow 将 pandas DataFrame 编写为包含日期的 Parquet 2.0?
- karate - 测试时管道损坏(写入失败)> 允许的最大内容长度
- rxjs - 需要帮助了解这种 Ngrx 效果
- sql - 如何在 SQL Server 中将 varchar 转换为日期时间格式
- python - Python 实数和虚数:如何打印 -2-2i
- python - 将多个数据框合并为一个而不创建重复的列
- javascript - 在vue中的小胡子括号内使用小胡子?