2017-06-05 98 views
1

我在MongoDB的這個數據蒙戈彙總:返回數組的總平均值

{ 
    "name": "FooBar", 
    "__v": 0, 
    "user_rating": [ 
    { 
    "date": "2017-06-02T16:19:32.002Z", 
    "user_rating": 5, 
    }, 
    { 
    "date": "2017-06-02T16:19:46.803Z", 
    "user_rating": 3, 
    }, 
    { 
    "date": "2017-06-02T16:20:01.244Z", 
    "user_rating": 5, 
    }, 
    { 
    "date": "2017-06-02T16:15:54.673Z", 
    "user_rating": 3, 
    }, 
    { 
    "date": "2017-06-02T16:53:42.489Z", 
    "user_rating": 5, 
    } 
] 
} 

我需要過濾這顯示存儲的名稱,平均評級,評級的總量和如何許多5點的收視率,有多少4個評分等

這是我期待:

[ 
    { 
    "_id":"FooBar", 
    "countRating":5, 
    "averageRating":4.2, 
    "ratings": [ 
     {"num":3,"count":2}, 
     {"num":5,"count":3} 
    ] 
    } 
] 

不過,我似乎無法得到averageRating - 而不是我得到的平均水平兩個組合總s的每個評級。

這裏是我的蒙戈查詢:

db.collection.aggregate([ 
     { 
     $match: {"name": "FooBar"} 
     }, 
     { 
      $unwind: "$user_rating" 
     }, 
     { 
     $match: {"name": "FooBar"} 
     }, 
     { 
      $group: { 
      _id: { 
       "name": "$name", 
       "rating": "$user_rating.user_rating" 
      }, 
      averageRating: {$avg: "$user_rating.user_rating"}, 
      countRating: {$sum: 1} 
     } 
     }, 
     { 
     $group: { 
      _id: "$_id.name", 
      countRating: {"$sum": "$totalRatings"}, 
      averageRating: {"$avg": "$averageRating"}, 
      "rating": { 
      "$push": { 
       "num": "$_id.rating", 
       "count": "$totalRatings" 
      } 
      }, 
     } 
     }]); 

誰能幫助這裏得到的總體平均? 謝謝!

回答

0
db.collection.aggregate([ 
     { $match: {"name": "FooBar"} }, 
     { $unwind: "$user_rating" }, 
     { 
      $group: { 
       _id : "$name", 
       avg: {$avg: "$user_rating.user_rating" }, 
       ratings: {$push: "$user_rating.user_rating" } 
      } 
     }, 
     { $unwind: "$ratings" }, 
     { 
      $group: { 
       _id: { name: "$_id", num: "$ratings", avg: "$avg" }, 
       count: { $sum: 1 }    
      } 
     }, 
     { 
      $group: { 
       _id: { name: "$_id.name", avg: "$_id.avg" }, 
       ratings: { $push: { num: "$_id.num", count: "$count" }} 
      } 
     }, 
     { $project: {_id:0, name:"$_id.name", averageRating: "$_id.avg", ratings: 1}} 
]) 

我在這裏使用了附加分組來計算總平均評分。然後展開結果並在分組鍵中傳遞計算的平均值。

輸出:

{ 
    "name" : "FooBar", 
    "averageRating" : 4.2, 
    "ratings" : [ 
     { 
      "num" : 3, 
      "count" : 2 
     }, 
     { 
      "num" : 5, 
      "count" : 3 
     } 
    ] 
} 
+1

完美!謝謝! – beddow