Node.js 如何获取mongodb聚合中嵌入集合的总和?
我在使用mongodb聚合时遇到一些问题。这是数据收集Node.js 如何获取mongodb聚合中嵌入集合的总和?,node.js,mongodb,aggregation,Node.js,Mongodb,Aggregation,我在使用mongodb聚合时遇到一些问题。这是数据收集 { "subject":"maths", "year" : "2018" "marks" : [ { "stuId" : "0001", "mark" : "90" }, { "stuId" : "0002", "mark" : "56" } ] } { "subject":"science", "year" : "2018" "marks" : [ { "
{
"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)
}
);
这应该可以做到,假设你能找到stuId post组。 顺便说一句,我强烈建议修改您的数据设计,使年份为实际的日期时间类型,而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"} }
}}
]);
这应该可以做到,假设你能找到stuId post组。 顺便说一句,我强烈建议修改您的数据设计,使年份为实际的日期时间类型,而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"} }
}}
]);
清晰:你想要所有学生的分数总和和平均分数?你试过什么吗?@AlexBlex我试过这个代码。问题updated@BuzzMoschetti是的。由于错误,您没有结果。如果您在回拨中检查err,它应该说明$group阶段缺少_id。我相信你想写$group:{{u id:…}清晰:你想得到所有学生每年的分数总和和平均分数?你尝试过什么吗?@AlexBlex我尝试过这个代码。问题updated@BuzzMoschetti是的。由于错误,您没有结果。如果您在回拨中检查err,它应该说明$group阶段缺少_id。我相信您想编写$group:{U id:…}@SachinMuthumala w.r.t您提供的此查询的样本数据集运行良好,请,我猜您提供的年份过滤器是一个数字,其中数据集的字符串是。@SachinMuthumala w.r.t您提供的此查询的样本数据集运行良好,请,我猜您提供的年份过滤器是一个数字,在数据集中,它是字符串。