2017-02-20 43 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鳴春CSC類分組的學生。如果$match刪除學生ID採取的所有類,他們根本不在分組結果。

如何避免失去這些學生,或者這是錯誤的做法?

編輯:另外,好像我需要有條件$sum$group僅由學生證,存儲領域爲springCsc$project通過與fallCsc值相結合的最終價值,但我不能讓$sum到與$cond一起工作。

回答

1

如果你只是想要在春季和秋季結合的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操作符!感謝您的幫助。我驗證了查詢在我的數據集上按預期工作。 –