2017-04-24 2 views
2

にフィールドの値と一致する必要がありますのすべてのテストの平均総thatn少ないスコアIは、Test1を持つ学生の名前を細かくする必要が集約フレームワークのように、私は学生の文書のコレクションを持っているグループの総

{ 
     "_id" : 1, 
     "Student" : "Sim", 
     "Test1" : 59, 
     "Test2" : 94, 
     "Test3" : 81 
} 
{ 
     "_id" : 2, 
     "Student" : "Sam", 
     "Test1" : 60, 
     "Test2" : 77, 
     "Test3" : 81 
} 

集約フレームワークを使用して、クラス全体。

私は次のグループセクションに合計平均値を得ることができますが、,,,

、その後による

db.students.aggregate([ 
    {$project: { 
     Stu: '$Student', 
     Test1: '$Test1', 
     av: {$avg: ['$Test1', '$Test2', '$Test3']} 
    } }, 
    {$group: { _id: null, 
       totAvg: {$avg : '$av'} 
    } 
]); 

場合、私は試合のセクションに比較するために、学生とTEST1を失いました。

答えて

1

$push + $filterを使用してください。総平均マークに対してそれらを比較し、一致するレコードを維持するために$project段階で$filterに続くすべてのtest1マークとStudent名を維持する$group段階で

$push

$map$filterをラップして、学生名のみをプロジェクトに入れることができます。

db.students.aggregate([{ 
     $project: { 
      Stu: '$Student', 
      Test1: '$Test1', 
      av: { 
       $avg: ['$Test1', '$Test2', '$Test3'] 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: null, 
      studentTest1: { 
       $push: { 
        "Student": "$Stu", 
        "Test1": "$Test1" 
       } 
      }, 
      totAvg: { 
       $avg: '$av' 
      } 
     } 
    }, 
    { $project: 
    { lessthanAvgStudentNames: 
     { 
      $map: 
      { 
       input: { 
        $filter: { 
         input: "$studentTest1", 
         as: "resultf", 
         cond: { 
          $lt: ["$$resultf.Test1", "$totAvg"] 
         } 
        } 
       }, 
       as: "resultm", 
       in: "$$resultm.Student" 
      } 
     } 
    } 
    } 
]); 
+0

ありがとうございます!それは動作します! ($ filter、私には新しく、,,,)。私はどのようにスムーズな名前だけを投影するのですか? – Rachel

+0

ようこそ。学生名のみを投影する '$ map'を含むように更新されました。ここにリンクhttps://docs.mongodb.com/manual/reference/operator/aggregation/map/とhttps://docs.mongodb.com/manual/reference/operator/aggregation/filter/ – Veeram

+0

あなたは狡猾です!感謝万円! – Rachel

関連する問題