多个子字段的 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 查询匹配的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:匹配字符串字段中的多个值

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

何时对 mongodb 中的多个键进行索引

MongoDB find() 在匹配(字段,值)时返回子文档

MongoDB find() 在匹配(字段,值)时返回子文档

如何匹配 MongoDB 中的子文档数组?