如何在MongoDB中按数组内的字段值进行分组?

3

我有一个学生成绩系统,使用了MongoDB。我在MongoDB中有以下文档:

如何获取一门特定课程中获得"A"、"B"、"C"、"D"等分数的学生数量。每门课程的"_id"都保持不变。

{
  _id: "60b223541338467beaf3ae0d",
  studentName: "John Doe"
  studentGradingDetails: [
    {
      _id: "60b21e47e5462929cab27a98",
      term: "semester-1",
      subject: "chemistry",
      grade: "A",
      createdAt: "2021-05-29T10:58:15.113Z",
    },
    {
      _id: "60b21e47e5462929cab27a99",
      term: "semester-2",
      subject: "computer_science",
      grade: "B",
      createdAt: "2021-05-29T10:58:15.113Z",
    },
  ],
  createdAt: "2021-05-29T11:19:48.770Z",
}
{
  _id: "60b223541338467beaf3ae0e",
  studentName: "Will Smith"
  studentGradingDetails: [
    {
      _id: "60b21e47e5462929cab27a98",
      term: "semester-1",
      subject: "chemistry",
      grade: "D",
      createdAt: "2021-05-29T10:58:15.113Z",
    },
    {
      _id: "60b21e47e5462929cab27a99",
      term: "semester-2",
      subject: "computer_science",
      grade: "A",
      createdAt: "2021-05-29T10:58:15.113Z",
    },
  ],
  createdAt: "2021-05-29T11:19:48.770Z",
}

这是我尝试过的,但卡住了,不确定下一步该怎么做!?

await db.collection("studentsemestergrades")
        .aggregate([
            { $unwind: "$studentGradingDetails" },
            {
                $group: {
                    _id: "$studentGradingDetails._id",
                    
                },
            },
        ])
        .toArray();

期望输出:

各科目分数分布情况 (_id)

{
  "_id" : "60b21e47e5462929cab27a98",
  "A" : 12,
  "B" : 20,
  "C" : 8,
  "D" : 2
},
{
  "_id" : "60b21e47e5462929cab27a99",
  "A" : 5,
  "B" : 2,
  "C" : 8,
  "D" : 12
}
1个回答

2
  • $unwind用于展开studentGradingDetails数组
  • $group_idgrade分组,并获取总计数
  • $group仅按_id分组,并构造带有gradecount的对象的键值对数组
  • $arrayToObject将上述键值对数组转换为对象
  • $mergeObjects将上述转换后的对象和_id字段合并,如果需要可以添加更多字段
  • $replaceRoot将上述合并的对象替换为根对象
await db.collection("studentsemestergrades").aggregate([
  { $unwind: "$studentGradingDetails" },
  {
    $group: {
      _id: {
        _id: "$studentGradingDetails._id",
        grade: "$studentGradingDetails.grade"
      },
      count: { $sum: 1 }
    }
  },
  {
    $group: {
      _id: "$_id._id",
      grades: {
        $push: {
          k: "$_id.grade",
          v: "$count"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          { _id: "$_id" },
          { $arrayToObject: "$grades" }
        ]
      }
    }
  }
])

游乐场

(与IT技术有关)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接