在MongoDB中的数组中添加数字

在MongoDB中的数组中添加数字,mongodb,mongodb-query,Mongodb,Mongodb Query,我已经在我的文档中插入了以下两个内容。我一直在试图找到一种方法来显示国内学生总数和国际学生总数 每个大学的记录年份。我尝试在$project阶段使用$sum聚合,但得到的答案是0。我也不确定是否每年都要增加所有的国内学生,以及每年都要增加所有的国际学生 db.universities.insertMany([ {country: "Australia", city: "Melbourne", name: "SUT", domestic_

我已经在我的文档中插入了以下两个内容。我一直在试图找到一种方法来显示国内学生总数和国际学生总数 每个大学的记录年份。我尝试在$project阶段使用$sum聚合,但得到的答案是0。我也不确定是否每年都要增加所有的国内学生,以及每年都要增加所有的国际学生

db.universities.insertMany([
{country: "Australia", city: "Melbourne", name: "SUT",
domestic_students : [
{ year: 2014, number: 24774 },
{ year: 2015, number: 23166 },
{ year: 2016, number: 21913 },
{ year: 2017, number: 21715}],
international_students : [
{ year: 2014, number: 32178 },
{ year: 2015, number: 36780 },
{ year: 2016, number: 67899 },
{ year: 2017, number: 65321 }]
 },
{country: "Australia", city: "Sydney", name: "UTS",
domestic_students : [
{ year: 2014, number: 67891 },
{ year: 2015, number: 56312 },
{ year: 2016, number: 45679 },
{ year: 2017, number: 71235}]
}
]);


可以对一个数字数组求和,但不能对子文档数组求和。为此你需要

$unwind将数组“分解”为不同的文档(中间聚合)。因此,如果你这样做:

 $unwind: {
        path: '$domestic_students',
        preserveNullAndEmptyArrays: false
    }
最终,您将得到多个文档,其中包含一个子文档(而不是一系列子文档)

我想这正是你想要的:

db.universities.aggregate[{
    $unwind: {
        path: '$domestic_students',
        preserveNullAndEmptyArrays: false
    }
}, {
    $unwind: {
        path: '$international_students',
        preserveNullAndEmptyArrays: false
    }
}, {
    $group: {
        _id: '$country',
        dtotal: {
            $sum: '$domestic_students.number'
        },
        itotal: {
            $sum: '$international_students.number'
        }
    }
}]
我喜欢使用MongoDB compass帮助进行聚合,因为我可以从示例中看到阶段和结果: