繁体   English   中英

如何在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)
        }
    );

这应该可以做到,假设您可以理解_idstuId后组。
顺便说一句,我强烈建议修改您的数据设计,以便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"} }
    }}

]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM