ใช้ $unwind 2 ครั้ง (แยกอาร์เรย์นอก แล้วแยกอาร์เรย์ใน) แล้ว $group + $push รวมค่าทั้งหมดเป็นอาร์เรย์เดียว
ตัวอย่างข้อมูลทดสอบ (อาร์เรย์ซ้อน 2 ชั้น)
> db.demo389.insertOne({
"details":[
{"Name":["Chris","David"]},
{"Name":["Bob","Mike"]},
{"Name":["Carol","Sam"]},
{"Name":["David","John"]}
]
});
แสดงข้อมูล
> db.demo389.find();
{
"_id" : ObjectId("5e5d1d8f22064be7ab44e7f9"),
"details" : [
{"Name" : ["Chris", "David"]},
{"Name" : ["Bob", "Mike"]},
{"Name" : ["Carol", "Sam"]},
{"Name" : ["David", "John"]}
]
}
คำสั่ง Aggregation แปลงเป็นอาร์เรย์แบน (Flatten)
> db.demo389.aggregate([
{$unwind: "$details"},
{$unwind: "$details.Name"},
{$project: {"_id": "$_id", "Name": "$details.Name"}},
{$group: {"_id": "_id", "out": {$push: "$Name"}}},
{$project: {"_id": 0, "NameArray": "$out"}}
])
ผลลัพธ์ (อาร์เรย์เดียวรวมทุกชื่อ)
{
"NameArray" : ["Chris", "David", "Bob", "Mike", "Carol", "Sam", "David", "John"]
}
คำอธิบาย:
$unwind: "$details"แยกอาร์เรย์นอก (4 เอกสาร)$unwind: "$details.Name"แยกอาร์เรย์ใน (8 เอกสาร)$projectเลือกเฉพาะ Name$groupรวม Name ทั้งหมดด้วย $push$projectจัดรูปแบบผลลัพธ์