Это необязательная проблема обзора из учебного пособия, не заслуживающая внимания. Я пытаюсь найти количество курсов компьютерной науки, взятых весной и осенью, вместе взятых для каждого студента с их майором. Пример документа с только поля, необходимые для этого запроса:Условная сумма элементов массива на одном объекте в Mongo
> 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
по студенческому билету, $sum
Ming пружинные CSC классы для сгруппированных студентов. Если $match
удаляет все классы, взятые идентификатором студента, они вообще не находятся в сгруппированных результатах.
Как избежать потери этих студентов, или это неправильный подход?
Edit: Кроме того, мне кажется, что мне нужно условно $sum
как я $group
только студенческий билет, хранящего поле как springCsc
и $project
окончательное значение путем объединения со значением fallCsc, но я не могу получить $sum
к работайте с $cond
.
Я не мог найти оператора $ concatArrays по какой-то причине! Спасибо за помощь. Я проверил, что запрос работает так, как ожидалось, в моем наборе данных. –