Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB Aggregate: รวมคะแนนผู้เล่นจากอาร์เรย์ในหลายเอกสาร


สร้างคอลเลกชันตัวอย่าง

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

แสดงข้อมูล

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

คิวรี Aggregate: $unwind + $group สองครั้ง

> 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 } }
])

ผลลัพธ์: รวมคะแนน Chris=1100, David=600

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