Dùng aggregation pipeline với $unwind (phân tách mảng) lồng nhau 2 lần, sau đó $group với $push để gom thành một mảng đơn.
Tạo collection phức tạp:
> db.demo389.insertOne({
"details":[
{ "Name":[ "Chris", "David" ] },
{ "Name":[ "Bob", "Mike" ] },
{ "Name":[ "Carol", "Sam" ] },
{ "Name":[ "David", "John" ] }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5d1d8f22064be7ab44e7f9") }
Xem dữ liệu:
> db.demo389.find();
Aggregation làm phẳng (flatten) mảng lồng nhau:
> 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" } } ])Kết quả (mảng đơn 8 phần tử):
Các bước:
$unwind: "$details": tách mảng details thành 4 tài liệu$unwind: "$details.Name": tách từng mảng Name thành các tài liệu riêng (tổng 8)$project: chọn trường cần thiết$groupvới$push: gom lại thành mảng NameArrayMongoDB 4.4+: Dùng
$reduce+$concatArraystrong $project để làm phẳng mà không cần unwind/group (hiệu quả hơn).