如何在 mongodb 聚合中获取嵌入式集合的总和?
How to get sum of embedded collection in mongodb aggregation?
我在使用 mongodb 聚合时遇到了一些问题。这是资料收集,
{
"subject":"maths",
"year" : "2018"
"marks" : [
{
"stuId" : "0001",
"mark" : "90"
},
{
"stuId" : "0002",
"mark" : "56"
}
]
}
{
"subject":"science",
"year" : "2018"
"marks" : [
{
"stuId" : "0001",
"mark" : "50"
},
{
"stuId" : "0002",
"mark" : "65"
}
]
}
我想计算每个学生的分数总和,并取每个学生的平均分,如下所示,
//sum of maths and science subjects
{ "year" : "2018", "stuId" : "0001", "sum": "140"},
{ "year" : "2018", "stuId" : "0002", "sum": "121"}
我试过这段代码。没有任何结果。
mark.aggregate([
{
$match: {
"year": year
},
},
{ $unwind: "$marks" },
{
$group: {
"id": "$marks.stuId", "Total": { $sum: "$marks.mark" }
}
}
],
function (err, results) {
res.send(results)
console.log(results)
}
);
这应该可以做到,假设您可以理解 _id
是 stuId
post 组。
顺便说一句,我强烈建议修改您的数据设计,使 year
是一个实际的 datetime
类型,而 mark
是一个整数。将它们作为绳子随身携带会使路上的一切变得更加困难。
var inp = "2018";
c = db.foo.aggregate([
{$match: {"year": inp}}
,{$unwind: "$marks"}
,{$group: {_id: "$marks.stuId",
sum: {$sum: {$toInt: "$marks.mark"} },
avg: {$avg: {$toInt: "$marks.mark"} }
}}
]);
我在使用 mongodb 聚合时遇到了一些问题。这是资料收集,
{
"subject":"maths",
"year" : "2018"
"marks" : [
{
"stuId" : "0001",
"mark" : "90"
},
{
"stuId" : "0002",
"mark" : "56"
}
]
}
{
"subject":"science",
"year" : "2018"
"marks" : [
{
"stuId" : "0001",
"mark" : "50"
},
{
"stuId" : "0002",
"mark" : "65"
}
]
}
我想计算每个学生的分数总和,并取每个学生的平均分,如下所示,
//sum of maths and science subjects
{ "year" : "2018", "stuId" : "0001", "sum": "140"},
{ "year" : "2018", "stuId" : "0002", "sum": "121"}
我试过这段代码。没有任何结果。
mark.aggregate([
{
$match: {
"year": year
},
},
{ $unwind: "$marks" },
{
$group: {
"id": "$marks.stuId", "Total": { $sum: "$marks.mark" }
}
}
],
function (err, results) {
res.send(results)
console.log(results)
}
);
这应该可以做到,假设您可以理解 _id
是 stuId
post 组。
顺便说一句,我强烈建议修改您的数据设计,使 year
是一个实际的 datetime
类型,而 mark
是一个整数。将它们作为绳子随身携带会使路上的一切变得更加困难。
var inp = "2018";
c = db.foo.aggregate([
{$match: {"year": inp}}
,{$unwind: "$marks"}
,{$group: {_id: "$marks.stuId",
sum: {$sum: {$toInt: "$marks.mark"} },
avg: {$avg: {$toInt: "$marks.mark"} }
}}
]);