2017-04-08 13 views
0

多くのテストでテスト結果の平均スコアを計算しようとしていますが、ドキュメントはpersonオブジェクト内で2つのレベルにネストされています。ネストされたコレクション内のMongoDB平均

私は、ネストされたコレクション

{ "name" : "Person Name", 
"tests" : [ 
    { 
     "testID" : "01" 
     }, 
     "scores" : { 
      "math" : 3.0, 
      "science" : 2.0 
     } 
    } 
] 
} 

内の平均を取得することはできませんが、以下の私のMongoDBのクエリです。

db.students.aggregate([ 
    { 
    $project: { 
     mathAve: { $avg: "$math"}, 
     scienceAve: { $avg: "$science" }, 
    } 
    } 
]) 

答えて

1

1人のドキュメントの問題を解決する方法はいくつかあります。

以下クエリ$divideのそのフィールドの平均を計算するtestsアレイの$size続い(mathscience)値の和にtests文書をINGの$reduceによって2つのオペランド。

Expressions $と$$はフィールド/集計演算子/集計ステージと内部変数をそれぞれ参照します。各フィールドの$avgを計算する$group続い

Mongoのバージョン> = 3.4

db.students.aggregate({ 
    $project: { 
     mathAve: {$divide:[{ 
      $reduce: { 
      input: "$tests.scores.math", 
      initialValue: 0, 
      in: { $sum: [ "$$value", "$$this" ] } 
     } 
     }, {$size:"$tests"}]}, 
     scienceAve: {$divide:[{ 
      $reduce: { 
      input: "$tests.scores.science", 
      initialValue: 0, 
      in: { $sum: [ "$$value", "$$this" ] } 
     } 
     }, {$size:"$tests"}]} 
    } 
}) 

Mongoの版= 3.2

以下クエリ$unwind S tests文書。

db.students.aggregate( 
{$unwind:"$tests"}, 
{$group: { 
     _id:null, 
     mathAve: { $avg: "$tests.scores.math"}, 
     scienceAve: { $avg: "$tests.scores.science" } 
    } 
}) 
関連する問題