Mongodb Mongo中单个对象上数组元素的条件和

Mongodb Mongo中单个对象上数组元素的条件和,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,这是学习指南中的可选复习问题,不值得表扬。我试图找出每个学生在春季和秋季参加的计算机科学课程的数量,以及他们的专业。仅包含此查询所需字段的示例文档: > db.students.find().limit(1).pretty(); { "_id" : 10456673, "major" : "CSC", "fall" : { "units" : 12, "courses" : [ "CSC 365",

这是学习指南中的可选复习问题,不值得表扬。我试图找出每个学生在春季和秋季参加的计算机科学课程的数量,以及他们的专业。仅包含此查询所需字段的示例文档:

> 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课程但秋季参加CSC课程的学生的秋季值

当我尝试仅为上面的spring字段
$match
CSC类,然后根据学生id
$group
$sum
为分组学生指定spring CSC类时,就会出现此问题。如果
$match
删除学生id参加的所有课程,则这些课程根本不在分组结果中

我如何避免失去这些学生,或者这是错误的方法


编辑:另外,似乎我需要有条件地将
$sum
作为我的
$group
仅通过学生id,将字段存储为
springCsc
,并将
$project
与fallCsc值结合作为最终值,但如果您只需要id,我无法将
$sum
$cond
一起使用,春季和秋季所修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
         }
      }
   }
]);

不知什么原因,我找不到$concatarray操作符!谢谢你的帮助。我验证了查询在我的数据集上是否按预期工作。