【问题标题】:How to get sum of embedded collection in mongodb aggregation?如何在 mongodb 聚合中获取嵌入式集合的总和?
【发布时间】:2020-05-01 10:16:43
【问题描述】:

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

【问题讨论】:

  • 清晰:您想要所有学生的分数总和和平均分数?
  • 你有什么尝试吗?
  • @AlexBlex 我已经尝试过这段代码。 (问题已更新)
  • @BuzzMoschetti 是的。
  • 由于错误,您没有结果。如果您在回调中检查“err”,它应该会说明在 $group 阶段缺少 _id。我相信你想写$group: {"_id":.....}

标签: node.js mongodb aggregation


【解决方案1】:

这应该可以做到,假设您可以理解 _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"} }
    }}

]);

【讨论】:

  • @SachinMuthumala wrt 您提供的示例数据集运行良好,请have a look,我猜您提供的年份过滤器是numeric,在数据集中它的@987654329 @.
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多