Để truy xuất document lồng nhau sâu (nested embedded document), sử dụng $unwind hai lần trong pipeline aggregate.
Tạo collection với cấu trúc lồng 3 cấp
> db.demo631.insert({
id: "101",
Info1: [
{
CountryName: "US",
Info2: [
{ Name: "Chris", Age: 24 },
{ Name: "Bob", Age: 22 }
]
}
]
});
Hiển thị document gốc
> db.demo631.find();
Kết quả:
{
"_id" : ObjectId("5e9b0eb16c954c74be91e6bf"),
"id" : "101",
"Info1" : [
{
"CountryName" : "US",
"Info2" : [
{ "Name" : "Chris", "Age" : 24 },
{ "Name" : "Bob", "Age" : 22 }
]
}
]
}
Truy vấn lấy document con có Age = 22
> db.demo631.aggregate([
{ "$unwind": "$Info1" },
{ "$unwind": "$Info1.Info2" },
{ "$match": { "Info1.Info2.Age": 22 } }
])
Kết quả (chỉ giữ document con khớp):
{
"_id" : ObjectId("5e9b0eb16c954c74be91e6bf"),
"id" : "101",
"Info1" : {
"CountryName" : "US",
"Info2" : { "Name" : "Bob", "Age" : 22 }
}
}
Giải thích quy trình:
$unwind: "$Info1": Phân rã mảngInfo1→ mỗi document chứa 1 phần tử Info1$unwind: "$Info1.Info2": Phân rã tiếp mảngInfo2bên trong → mỗi document chứa 1 phần tử Info2$match: Lọc giữ document cóInfo1.Info2.Age = 22
Kết quả: Document gốc được "làm phẳng" (flatten) để truy xuất trực tiếp object con khớp điều kiện.