在过滤聚合中选择嵌套字段

问题描述 投票:0回答:1

如何聚合、过滤嵌套数组和投影选定的嵌套字段?

我有以下数据:

{
  "teacher": "Ben",
  "students": [
    {
      "name": "Liz",
      "age": 8,
      "pets": 1
    },
    {
      "name": "Jon",
      "age": 9,
      "pets": 3
    },
    {
      "name": "Eva",
      "age": 9,
      "pets": 2
    }
  ]
}

..并且想要查询以获得此结果:

{
  "teacher": "Ben",
  "students": [
    {
      "name": "Jon",
      "pets": 3
    },
    {
      "name": "Eva",
      "pets": 2
    }
  ]
}

我可以按某个年龄进行过滤,但如何仅返回嵌套学生数据中的

name
pets
字段?尝试以我能想到的所有方式来投影这些领域,但没有运气,所以我猜我可能找错了地方。

db.classes.aggregate([
  { "$match": {} },
  { "$project": {
    "_id": 0,
    "teacher": 1
    "students": {
      "$filter": {
        input: "$students",
        cond: {
          "$eq": [ "$$this.age", 9 ],
        }
      }
    }
  }}
])
mongodb mongodb-query aggregation-framework
1个回答
0
投票

您可以使用

$unset
阶段删除您不需要的字段

db.collection.aggregate([
  {
    "$match": {}
  },
  {
    "$project": {
      "_id": 0,
      "teacher": 1,
      "students": {
        "$filter": {
          input: "$students",
          cond: {
            "$eq": [
              "$$this.age",
              9
            ]
          }
        }
      }
    }
  },
  {
    $unset: "students.age"
  }
])

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.