MongoDB 聚合 - 按子文档过滤

MongoDB aggregate - filter by subdocument

我有一个 mongodb 集合,其结构如下:

[
  {
    name: "name1",
    instances: [{value:1, score:2}, {value:2, score:5}, {value:2.5, score:9}]
  },
  {
    name: "name2",
    instances: [{value:6, score:3}, {value:1, score:6}, {value:3.7, score:5.2}]
  }
]

当我想从文档中获取所有数据时,我使用 aggregate 因为我希望每个实例都作为单独的文档返回:

db.myCollection.aggregate([{$match:{name:"name1"}}, {$unwind:"$instances"}, {$project:{name:1, value:"$instances.value", score:"$instances.score"}}])

一切都如我所愿。

现在回答我的问题:我想按分数或按值过滤返回的数据。例如,我想要一个包含 name1 的所有子文档的数组,这些子文档的值大于或等于 2。 我试图添加到 $match 对象 'instances.value':{$gte:2},但它没有过滤任何东西,我仍然得到了这个查询的所有 3 个文档。

有什么想法吗?

展开后 instances 然后再次使用 $match 如下

    db.collectionName.aggregate({
    "$match": {
    "name": "name1"
    }
}, {
    "$unwind": "$instances"
}, {
    "$match": {
    "instances.value": {
        "$gte": 2
    }
    }
}, {
    $project: {
    name: 1,
    value: "$instances.value",
    score: "$instances.score"
    }
})

或者,如果您在 project 之后尝试 $match,然后按如下方式使用

 db.collectionName.aggregate([{
     $match: {
     name: "name1"
     }
 }, {
     $unwind: "$instances"
 }, {
     $project: {
     name: 1,
     value: "$instances.value",
     score: "$instances.score"
     }
 }, {
     "$match": {
     "value": {
         "$gte": 2
     }
     }
 }])