2017-02-20 5 views
1

これは、学習ガイドのオプションのレビュー問題です。私は、春と秋に撮影されたコンピュータサイエンスコースの数を、各学生IDとその専攻と合わせて調べようとしています。このクエリのためだけに必要なフィールドを持つ文書例:Mongoの単一オブジェクト上の配列要素の条件付き合計

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 } 
を、私は私がこれまで書いてきた最高の部分クエリであると信じる何

> 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" 
     ] 
    } 
} 

しかし、今私はどのようにCSCの春のクラスの数をカウントし、CSCを取っていない学生の秋の値を失うことなく、fallCscの値、に追加する方法を理解していない春の授業は、秋にはです。

この問題は、上記のスプリングフィールドのみのCSCクラスと、$groupの学生ID、$sumグループ化された生徒の春のCSCクラスを作成しようとすると発生します。 $matchが生徒IDによって取得されたすべてのクラスを削除した場合、グループ化された結果にはまったく含まれていません。

これらの生徒を失うことを避けるにはどうすればよいのですか、これが間違ったアプローチですか?

編集:また、私が必要とするように思えるの条件付き$sumとしてIのみ学生証、springCsc$project fallCsc値と組み合わせることにより、最終的な値としてフィールドを格納しますが、私は$sumを得ることができないことで$group$condで作業してください。

答えて

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

何らかの理由で$ concatArrays演算子が見つかりませんでした。ご協力ありがとうございました。私はクエリが私のデータセットで期待通りに動作することを確認しました。 –