2017-02-20 8 views
1

Это необязательная проблема обзора из учебного пособия, не заслуживающая внимания. Я пытаюсь найти количество курсов компьютерной науки, взятых весной и осенью, вместе взятых для каждого студента с их майором. Пример документа с только поля, необходимые для этого запроса:Условная сумма элементов массива на одном объекте в 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.

ответ

1

Если вы просто хотите, чтобы id, основной и общий нет курсов CS, взятых вместе весной и осенью, ниже запрос будет работать. Но если вы хотите что-то еще, тогда вам нужно написать другой запрос.

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 
     } 
     } 
    } 
]); 
+0

Я не мог найти оператора $ concatArrays по какой-то причине! Спасибо за помощь. Я проверил, что запрос работает так, как ожидалось, в моем наборе данных. –