Node.js 如何获取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" : [ { "

我在使用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)
        }
    );

这应该可以做到,假设你能找到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您提供的此查询的样本数据集运行良好,请,我猜您提供的年份过滤器是一个数字,在数据集中,它是字符串。