如何在 mongodb 中获取匹配的子文档

How to get matching subdocuments in mongodb

我有这样的架构 -

 {
   "_id":"ObjectId(""622f950e73043487031bb3ee"")",
   "outerTimeStamp" : "14-Mar-2022",
   "filtered":{
      "data":[
         {
            "Price":14350,
            "expiryDate":"17-Mar-2022",
            "info1":{
               "Price":14350,
               "expiryDate":"17-Mar-2022",
            },
            "info2":{
               "Price":14350,
               "expiryDate":"17-Mar-2022"
            }
         },
         {
            "Price":14350,
            "expiryDate":"17-Mar-2022",
            "info1":{
               "Price":14350,
               "expiryDate":"17-Mar-2022",
            },
            "info2":{
               "Price":14350,
               "expiryDate":"17-Mar-2022"
            }
         },
         ......
         ....
     ]
    }
}

我需要一个文档中的所有子文档,其中 expiryDate == "17-Mar-2022"

我使用了以下查询 -

db.collection.find({ "filtered.data" : { $elemMatch : { "expiryDate" : "17-Mar-2022"}} }, { "filtered.data.$" : 1 })

它只是 returns 第一个匹配的子文档,但还有许多其他文档可用

如果我不使用“.$”,那么它 returns 所有那些文档,甚至那些不符合查询条件的文档。

提前致谢

你可以通过聚合/$filter 来做 simpy:

db.collection.aggregate([
{
  $match: {
  "filtered.data.expiryDate": "17-Mar-2022"
  }
},
{
 $addFields: {
  "filtered.data": {
    "$filter": {
      "input": "$filtered.data",
      "as": "d",
      "cond": {
        "$eq": [
          "$$d.expiryDate",
          "17-Mar-2022"
        ]
       }
     }
    }
  }
 }
])

为了获得最佳结果,需要在“filtered.data.expiryDate”

上创建索引

playground