多个子字段的 MongoDB 查询匹配
Posted
技术标签:
【中文标题】多个子字段的 MongoDB 查询匹配【英文标题】:MongoDB query match for several subfields 【发布时间】:2022-01-23 01:15:59 【问题描述】:花了几个小时试图解决这个问题,但在 *** 的文档中没有找到我的答案,我在这里提出了一个问题。
我有一个大型集合(350 万个文档),并且想要过滤掉与特定子字段组合匹配的那些。
例如文件看起来像:
_id:...,
...<a number of fields>
"ML":[
"_id": ...,
... <more fields>
"Op": [
"_id": ...,
"Pr":
"P94": <number>,
"P95" : ...,
...,
"P145": <optional and number>
...,
...
],
...,
...
],
...
所以 P145 有时存在,有时不存在。
我想找到所有具有“ML.Op.Pr”的文档 both “P94”:8 and P145 存在. 我尝试过但失败了(因为我没有/0 结果):
.find("ML.Op.Pr":"P94":8,"P145":1) .find("ML.Op.Pr":$and["P94":8,"P145":1])我也尝试过 $and 作为第一步,
.find($and["ML.Op.Pr.P94":8,"ML.Op.Pr.P145":1])但是由于 ML 和 Op 都是一个包含多个条目的数组,所以它返回的结果太多。我需要将两个 Pr 设置在同一个数组元素中。
如您所见,我首先尝试查找 P145 = 1 的位置,因为当我将其替换为 $exists 时,它根本不会解析。
我应该怎么做?
【问题讨论】:
【参考方案1】:您必须对每个子数组划分使用嵌套的$elemMatch
才能获得所需的结果。
db.collection.find(
"ML":
"$elemMatch":
"Op":
"$elemMatch":
"Pr.P94": 8,
"Pr.P145":
"$exists": true
,
)
Mongo Playground sample execution
【讨论】:
以上是关于多个子字段的 MongoDB 查询匹配的主要内容,如果未能解决你的问题,请参考以下文章
在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档
MongoDB find() 在匹配(字段,值)时返回子文档