如何对 MongoDB 中数组内的字段值进行分组?
How to groupby on a field value that is inside an array in MongoDB?
我有使用 MongoDB 的学生评分系统。我在 MongoDB 中有以下文件:
我如何获得grade
“A”、“B”、“C”、“D”的学生人数 subject
。每个主题的“_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
}
$unwind
解构studentGradingDetails
数组
$group
通过 _id
和 grade
得到总计数
$group
只用_id
构造对象的键值对数组grade
和count
$arrayToObject
将上面的键值对数组转换为对象
$mergeObjects
合并上面转换的对象和 _id
字段如果需要你可以添加更多字段
$replaceRoot
将上面的合并对象替换为 root
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" }
]
}
}
}
])
我有使用 MongoDB 的学生评分系统。我在 MongoDB 中有以下文件:
我如何获得grade
“A”、“B”、“C”、“D”的学生人数 subject
。每个主题的“_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
}
$unwind
解构studentGradingDetails
数组$group
通过_id
和grade
得到总计数$group
只用_id
构造对象的键值对数组grade
和count
$arrayToObject
将上面的键值对数组转换为对象$mergeObjects
合并上面转换的对象和_id
字段如果需要你可以添加更多字段$replaceRoot
将上面的合并对象替换为 root
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" }
]
}
}
}
])