รวม (Merge) อาร์เรย์จากหลายเอกสารเป็นอาร์เรย์เดียวด้วย $push
บทความนี้สาธิตการใช้ $group ร่วมกับ $push ใน Aggregation Pipeline เพื่อรวมค่าของฟิลด์อาร์เรย์จากหลายเอกสารเข้าด้วยกันเป็นอาร์เรย์ของอาร์เรย์
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
> db.demo64.insertOne({"Subjects":["MySQL","MongoDB","Java"]});
{ "acknowledged": true, "insertedId": ObjectId("5e28762bcfb11e5c34d89936") }
> db.demo64.insertOne({"Subjects":["Oracle","Spring","Python"]});
{ "acknowledged": true, "insertedId": ObjectId("5e28763fcfb11e5c34d89937") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo64.find();
ผลลัพธ์:
{ "_id": ObjectId("5e28762bcfb11e5c34d89936"), "Subjects": ["MySQL", "MongoDB", "Java"] }
{ "_id": ObjectId("5e28763fcfb11e5c34d89937"), "Subjects": ["Oracle", "Spring", "Python"] }
ขั้นตอนที่ 3: Aggregation Pipeline รวมอาร์เรย์
$group- จัดกลุ่มทั้งหมด (_id: null) ใช้$pushสะสมค่าSubjectsทั้งอาร์เรย์เข้าไปในอาร์เรย์ใหม่$project- ซ่อน _id
> db.demo64.aggregate([
{ "$group": { "_id": null, "Subjects": { "$push": "$Subjects" } }},
{ "$project": { "_id": 0 }}
]);
ผลลัพธ์ที่ได้
{ "Subjects": [ ["MySQL", "MongoDB", "Java"], ["Oracle", "Spring", "Python"] ] }
สรุป: $push ใน $group จะสร้างอาร์เรย์ที่แต่ละ Element เป็นค่าของฟิลด์จากแต่ละเอกสาร หากฟิลด์นั้นเป็นอาร์เรย์ จะได้ Array of Arrays หากต้องการ Flatten ให้ใช้ $unwind ก่อน หรือ $reduce / $concatArrays ใน MongoDB เวอร์ชันใหม่