รวมเอกสารหลายชิ้นเป็นอาร์เรย์เดียวด้วย $push ใน $group
ตัวดำเนินการ $push ใน $group stage ของ Aggregation Pipeline ใช้สำหรับสะสมค่าจากทุกเอกสารในกลุ่ม (group) เข้าไปในอาร์เรย์เดียว
ตัวอย่างข้อมูลทดสอบ
> db.demo399.insertOne({ Name: "Chris", Age: 21 });
> db.demo399.insertOne({ Name: "David", Age: 22 });
> db.demo399.insertOne({ Name: "Chris", Age: 21 });
> db.demo399.insertOne({ Name: "Bob", Age: 23 });
> db.demo399.insertOne({ Name: "David", Age: 22 });
แสดงข้อมูลทั้งหมด
> db.demo399.find();
ผลลัพธ์: 5 เอกสารแยกกัน
คำสั่ง Aggregation รวมทุกเอกสารเป็นอาร์เรย์เดียว
> db.demo399.aggregate([
{
$group: {
_id: null,
array: { $push: { Name: "$Name", Age: "$Age" } }
}
}
]);
ผลลัพธ์ที่ได้
{
"_id": null,
"array": [
{ "Name": "Chris", "Age": 21 },
{ "Name": "David", "Age": 22 },
{ "Name": "Chris", "Age": 21 },
{ "Name": "Bob", "Age": 23 },
{ "Name": "David", "Age": 22 }
]
}
คำอธิบาย
- _id: null: หมายถึงจัดกลุ่มทุกเอกสารเป็นกลุ่มเดียว (ไม่แบ่งกลุ่ม)
- $push: { Name: "$Name", Age: "$Age" }: สร้างออบเจกต์ใหม่จากฟิลด์ Name และ Age ของแต่ละเอกสาร แล้ว push เข้าไปในอาร์เรย์ array
ตัวดำเนินการที่เกี่ยวข้อง
- $addToSet: คล้าย $push แต่ไม่เพิ่มค่าที่ซ้ำกัน (unique values only)
- $push ใน $group: สะสมค่าในแต่ละกลุ่ม
- $push ใน update(): เพิ่มค่าเข้าไปในอาร์เรย์ของเอกสารเดิม
กรณีใช้งานจริง
เหมาะสำหรับการสร้างรายงาน สรุปข้อมูล หรือเตรียมข้อมูลสำหรับ frontend ที่ต้องการข้อมูลเป็นอาร์เรย์เดียว