MongoDB:如何过滤 objects 的嵌套数组

MongoDB: How to filter nested array of objects

以下是我在 collection

中的两个条目
{
'_id': ObjectId('6287443338ed135a9e0b1b9d'),
 'data': [{'pChange': 166.9602348545503, 'strikePrice': 34000},
          {'pChange': -55.820553402827045, 'strikePrice': 34000},
          {'pChange': -60.35031847133758, 'strikePrice': 33600},
          {'pChange': -49.24757466962035, 'strikePrice': 34500}],
 'timestamp': '20-May-2022 13:01:59'
},
{
  '_id': ObjectId('7287443338ed13532e0b1b4y'),
  data': [{'pChange': 24.8545503, 'strikePrice': 34000},
          {'pChange': -51.827045, 'strikePrice': 34100},
          {'pChange': -20.133758, 'strikePrice': 33900},
          {'pChange': -40.57962035, 'strikePrice': 33500}],
  timestamp': '20-May-2022 13:02:45'
},

我想要所有行使价为 34000 的条目。

预期结果:

{
    '_id': ObjectId('6287443338ed135a9e0b1b9d'),
     'data': [{'pChange': 166.9602348545503, 'strikePrice': 34000},
              {'pChange': -55.820553402827045, 'strikePrice': 34000},],
     'timestamp': '20-May-2022 13:01:59'
},
{
  '_id': ObjectId('7287443338ed13532e0b1b4y'),
  data': [{'pChange': 24.8545503, 'strikePrice': 34000}}],
  timestamp': '20-May-2022 13:02:45'
},

使用$unwind 将每个数组元素放入其自己的文档中。然后我们可以使用 $match 来过滤 strkePrice。最后我们$group到re-assemble数组。

db.collection.aggregate({
  $unwind: "$data"
},
{
  $match: {
    "data.strikePrice": 34000
  }
},
{
  $group: {
    _id: "$_id",
    data: {
      $push: "$data"
    }
  }
})

Playground