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