这是学习指南中的可选复习问题,不值得信任。我试图在春季和秋季找到计算机科学课程的数量,每个学生身份和他们的专业。仅包含此查询所需字段的示例文档:
> db.students.find().limit(1).pretty();
{
"_id" : 10456673,
"major" : "CSC",
"fall" : {
"units" : 12,
"courses" : [
"CSC 365",
"CSC 419",
"MATH 428"
]
},
"spring" : {
"units" : 16,
"courses" : [
"CSC 430",
"CSC 453",
"BIO 161",
"HIST 217"
]
}
}
我认为是迄今为止我写过的最好的部分查询:
db.students.aggregate(
{
$unwind: "$fall.courses"
},
{
$match: {
"fall.courses": {
$in: ["CSC 103", "CSC 225", "CSC 349", "CSC 357", "CSC 365", "CSC 419", "CSC 430", "CSC 453"]
}
}
},
{
$group: {
"_id": {
"id": "$_id",
"spring": "$spring.courses",
"major": "$major"
},
"fallCsc": {
$sum: 1
}
}
},
{
$unwind: "$_id.spring"
}
);
输出:
{ "_id" : { "id" : 10048392, "spring" : "EE 461", "major" : "EE" }, "fallCsc" : 1 }
{ "_id" : { "id" : 10048392, "spring" : "CSC 315", "major" : "EE" }, "fallCsc" : 1 }
{ "_id" : { "id" : 10048392, "spring" : "CHM 231", "major" : "EE" }, "fallCsc" : 1 }
{ "_id" : { "id" : 72039451, "spring" : "CSC 357", "major" : "CSC" }, "fallCsc" : 2 }
{ "_id" : { "id" : 72039451, "spring" : "CSC 349", "major" : "CSC" }, "fallCsc" : 2 }
{ "_id" : { "id" : 72039451, "spring" : "STAT 312", "major" : "CSC" }, "fallCsc" : 2 }
{ "_id" : { "id" : 72039451, "spring" : "KIN 223", "major" : "CSC" }, "fallCsc" : 2 }
{ "_id" : { "id" : 10456673, "spring" : "CSC 430", "major" : "CSC" }, "fallCsc" : 2 }
{ "_id" : { "id" : 10456673, "spring" : "CSC 453", "major" : "CSC" }, "fallCsc" : 2 }
{ "_id" : { "id" : 10456673, "spring" : "BIO 161", "major" : "CSC" }, "fallCsc" : 2 }
{ "_id" : { "id" : 10456673, "spring" : "HIST 217", "major" : "CSC" }, "fallCsc" : 2 }
但是,我不明白如何计算并添加CSC弹簧类的数量到fallCsc值,而不会丢失那些没有参加CSC课程的学生的秋季课程价值。春天,但有秋天。
当我尝试$match
CSC类仅针对上面的弹簧字段然后$group
的学生ID,$sum
为分组学生的春季CSC课程时,会出现此问题。如果$match
删除了学生ID所占用的所有课程,则它们根本不在分组结果中。
如何避免失去这些学生,或者这是错误的做法?
编辑:此外,似乎我只需要$sum
作为$group
仅限学生ID,将字段存储为springCsc
和$project
最终值通过与fallCsc值结合使用,但我无法$sum
使用$cond
。
答案 0 :(得分:1)
如果你只想在春季和秋季结合使用的CS课程的id,主要和总数,下面的查询将有效。但如果你想要更多的东西,那么需要写一个不同的查询。
db.getCollection('test').aggregate([
{ $project: { major:"$major", allcourses: { $concatArrays: [ "$fall.courses", "$spring.courses" ] } } },
{$unwind: "$allcourses"},
{
$match: {
"allcourses": {
$in: ["CSC 103", "CSC 225", "CSC 349", "CSC 357", "CSC 365", "CSC 419", "CSC 430", "CSC 453"]
}
}
},
{
$group: {
"_id": {
"id": "$_id",
"major": "$major"
},
"total_cs_course": {
$sum: 1
}
}
}
]);