Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

MongoDB aggregate: tổng điểm người chơi trên nhiều document

Tính tổng PlayerScore cho mỗi PlayerName across các document, khi điểm lưu trong mảng Details.

Tạo collection demo131:

> db.demo131.insertOne({
   "_id": 101,
   "Details": [
      {"PlayerScore":500,"PlayerName":"Chris"},
      {"PlayerScore":400,"PlayerName":"David"}
   ]
});
> db.demo131.insertOne({
   "_id": 102,
   "Details": [
      {"PlayerScore":600,"PlayerName":"Chris"},
      {"PlayerScore":200,"PlayerName":"David"}
   ]
});

Pipeline: unwind Details, group theo PlayerName tính sum, group lại push vào mảng Details:

> db.demo131.aggregate([
   { $unwind: "$Details" },
   {
      $group: {
         _id: "$Details.PlayerName",
         Value: { $sum: "$Details.PlayerScore" }
      }
   },
   {
      $group: {
         _id: 0,
         Details: { $push: { Details: "$_id", Value: "$Value" } }
      }
   },
   { $project: { Details: 1, _id: 0 } }
])

Kết quả: Chris = 1100, David = 600:

{
   "Details" : [
      { "Details" : "David", "Value" : 600 },
      { "Details" : "Chris", "Value" : 1100 }
   ]
}