2017-01-29 12 views
0

私が持っている文書、このような値の平均を取得:MongoDBのグループは、同じIDを持つサブオブジェクトと

{ 
     "_id" : ObjectId("588e505fcdefc41e84c184cb"), 
     "Id" : 58614891, 
     "modifyDate" : 1485567717000, 
     "data" : [ 
       { 
         "id" : 99, 
         "stats" : { 
           "totalDepth" : 4, 
           "totalSpeed" : 2, 
           "totalLostSessions" : 2, 
           "KDI" : 8, 
         } 
       }, 
       { 
         "id" : 18, 
         "stats" : { 
           "totalDepth" : 2, 
           "totalSpeed" : 1, 
           "totalLostSessions" : 1, 
           "KDI" : 2, 
         } 
       } 
     ], 
     "timestampPull" : 1485721695291, 
     "region" : "eu", 
     "Status" : 200 
} 
{ 
     "_id" : ObjectId("588e5060cdefc41e84c184cd"), 
     "Id" : 38004043, 
     "modifyDate" : 1485515118000, 
     "data" : [ 
       { 

       { 
         "id" : 18, 
         "stats" : { 
           "totalDepth" : 5, 
           "totalSpeed" : 3, 
           "totalLostSessions" : 2, 
           "KDI" : 14, 
         } 
       }, 
       { 
         "id" : 62, 
         "stats" : { 
           "totalDepth" : 1, 
           "totalSpeed" : 0, 
           "totalLostSessions" : 1, 
           "KDI" : 1, 
         } 
       }, 
       { 
         "id" : 0, 
         "stats" : { 
           "totalDepth" : 155, 
           "totalSpeed" : 70, 
           "totalLostSessions" : 85, 
           "KDI" : 865, 
         } 
       } 
     ], 
     "timestampPull" : 1485721696025, 
     "region" : "na", 
     "Status" : 200 
} 

を、私は、「データ」のIDが一致した場合、すべての統計情報の平均値を計算します。

{ 
         "id" : 99, 
         "stats" : { 
           "totalDepth" : 4, 
           "totalSpeed" : 2, 
           "totalLostSessions" : 2, 
           "KDI" : 8, 
         } 
}, 
{ 
        "id" : 18, 
        "stats" : { 
          "totalDepth" : 3.5, 
          "totalSpeed" : 2, 
          "totalLostSessions" : 1.5, 
          "KDI" : 8, 
        } 
} ... 

mongoDBでこのような操作を実行できますか?すべてのデータを簡単にアプリケーションに取り込み、平均化することはできますが、これはあまり効果的ではありません。

答えて

1

以下の集計を試すことができます。

$unwinddataアレイ。 idによって

$groupと値の数を$sumする値の$avgcountを計算します。 countgt

1より
db.collection.aggregate({ 
    $unwind: "$data" 
}, { 
    $group: { 
     _id: "$data.id", 
     count: { 
      $sum: 1 
     }, 
     "totalDepth": { 
      $avg: "$data.stats.totalDepth" 
     }, 
     "totalSpeed": { 
      $avg: "$data.stats.totalSpeed" 
     }, 
     "totalLostSessions": { 
      $avg: "$data.stats.totalLostSessions" 
     }, 
     "KDI": { 
      $avg: "$data.stats.KDI" 
     } 
    } 
}, { 
    $match: { 
     count: { 
      $gt: 1 
     } 
    } 
}) 
+0

あるデータを保持する

$matchは私が望むとおりに動作する、ありがとうございます。 – Nefritox

関連する問題