2017-08-23 13 views
0

C#のMongoDBドライバでmongodbの最新バージョンを使用しています。私は少しの例を作りました。それは私の問題を説明するはずです。私の目標は、条件付きCount()、条件付きFirst()またはAverage()をフィルタ付きで作成することではありません。それは動作しません。c#とmongodb:フィルタ付き集計

この問題に対する最良の解決策は何でしょうか。任意のヒントありがとう

class MealDocument 
    { 
     public string name { get; set; } 
     public DateTime time { get; set; } 
     public Type type { get; set; } 
     public double calorie { get; set; } 
     public enum Type { breakfast, launch, dinner } 
    } 

    class MealAnalysis 
    { 
     public string name { get; set; } 
     public int numberOfBreakfast { get; set; } 
     public DateTime firstLaunch { get; set; } 
     public double averageDinnerCalorie { get; set; } 
    } 

    public void Test() 
    { 
     var collection = Database.GetCollection<MealDocument>("meal_test"); 

     collection.InsertMany(new MealDocument[] { 
      new MealDocument { name = "Thomas", type = MealDocument.Type.breakfast, calorie = 100, time = new DateTime(2017,8,1) }, 
      new MealDocument { name = "Thomas", type = MealDocument.Type.breakfast, calorie = 100, time = new DateTime(2017,8,2) }, 
      new MealDocument { name = "Thomas", type = MealDocument.Type.launch, calorie = 800, time = new DateTime(2017,8,3) }, 
      new MealDocument { name = "Thomas", type = MealDocument.Type.dinner, calorie = 2000, time = new DateTime(2017,8,4) }, 
      new MealDocument { name = "Peter", type = MealDocument.Type.breakfast, calorie = 100, time = new DateTime(2017,8,5) }, 
      new MealDocument { name = "Peter", type = MealDocument.Type.launch, calorie = 500, time = new DateTime(2017,8,6) }, 
      new MealDocument { name = "Peter", type = MealDocument.Type.dinner, calorie = 800, time = new DateTime(2017,8,7) }, 
      new MealDocument { name = "Paul", type = MealDocument.Type.breakfast, calorie = 200, time = new DateTime(2017,8,8) }, 
      new MealDocument { name = "Paul", type = MealDocument.Type.launch, calorie = 600, time = new DateTime(2017,8,9) }, 
      new MealDocument { name = "Paul", type = MealDocument.Type.launch, calorie = 700, time = new DateTime(2017,8,10) }, 
      new MealDocument { name = "Paul", type = MealDocument.Type.dinner, calorie = 1200, time = new DateTime(2017,8,11) } 
     }); 

     var analysis = collection.Aggregate() 
      .Group(
       doc => doc.name, 
       group => new MealAnalysis 
       { 
        name = group.Key, 

        // !!!! The condition in the Count() gets ignored 
        numberOfBreakfast = group.Count(m => m.type == MealDocument.Type.breakfast), 

        // !!!! Exception --> Not supported 
        averageDinnerCalorie = group.Where(m => m.type == MealDocument.Type.dinner).Average(m => m.calorie), 

        // !!!! Exception --> Not supported 
        firstLaunch = group.First(m => m.type == MealDocument.Type.launch).time 
       } 
      ); 

     var query = analysis.ToString(); 

     var result = analysis.ToList(); 
    } 
+0

私は** lunch ** break =)でお手伝いします。プロジェクトの一部が欠けています。この投稿はhttps://stackoverflow.com/questions/27315852/mongodb-driver-builders-how-to-group-and-get-averageに役立つかもしれません。私はカップルの時間にあなたに戻ってきます。 – BOR4

答えて

0

私は数時間を費やし、私はあなたがそれを必要とするように働くドライバを得ることができません。私は正しい解決策を思い付いていませんでしたが、これは私が得た最も近いものです。私はあなたが必要としない多くを計算するので、このソリューションの大きなファンではありませんが、Dbがそれほど大きくなく、問題の解決策を見つけるまで十分に機能するかもしれません。

var groupRes = collection.Aggregate() 
       .Group 
        (
         x => new { x.name, x.type }, 
         g => new 
         { 
          key = g.Key, 
          count = g.Count(), 
          averageCalorie = g.Average(y => y.calorie), 
          first = g.First().time 
         } 
        ) 
       .ToList(); 
      var paulStat = new MealAnalysis() 
      { 
       name = "Paul", 
       averageDinnerCalorie = groupRes.FirstOrDefault(x => (x.key.name == "Paul" && x.key.type == Type.dinner)).averageCalorie, 
       numberOfBreakfast = groupRes.FirstOrDefault(x => (x.key.name == "Paul" && x.key.type == Type.breakfast)).count, 
       firstLaunch = groupRes.FirstOrDefault(x => (x.key.name == "Paul" && x.key.type == Type.launch)).first 
      }; 

あなたは私はあなたがそれぞれの列挙のために必要なものを計算して、それぞれの人の彼MealAnalysisコンストラクト見ることができるように。たぶん、誰かが必要とする解決策を見つけるでしょう。

Good Luck!

+0

本当にありがとうございました。他にも見つけた場合は、 – Thomas

+0

を報告しますので問題ありません。私はここで欠けているものに非常に興味があります。 – BOR4