Để truy vấn document lồng sâu, sử dụng dot notation trong điều kiện find().
Tạo collection với cấu trúc lồng 3 cấp
> db.demo492.insertOne({
"ProductDetails": {
"StockDetails": [
{ "ProductName": "Product-1" },
{ "ProductName": "Product-2" },
{ "ProductName": "Product-3" }
]
}
});
> db.demo492.insertOne({
"ProductDetails": {
"StockDetails": [
{ "ProductName": "Product-4" },
{ "ProductName": "Product-5" },
{ "ProductName": "Product-6" }
]
}
});
Hiển thị dữ liệu
> db.demo492.find();
Kết quả (2 document):
{
"ProductDetails": { "StockDetails": [ { "ProductName": "Product-1" }, { "ProductName": "Product-2" }, { "ProductName": "Product3" } ] }
}
{
"ProductDetails": { "StockDetails": [ { "ProductName": "Product-4" }, { "ProductName": "Product-5" }, { "ProductName": "Product6" } ] }
}
Truy vấn lồng nhau tìm Product-1
> db.demo492.find({ "ProductDetails.StockDetails.ProductName": "Product-1" });
Kết quả (trả về document cha chứa Product-1):
{
"_id": ObjectId("5e849db8b0f3fa88e22790c2"),
"ProductDetails": {
"StockDetails": [
{ "ProductName": "Product-1" },
{ "ProductName": "Product-2" },
{ "ProductName": "Product3" }
]
}
}
Giải thích:
ProductDetails.StockDetails.ProductName: Dot notation đi qua 3 cấp: Object → Array → Field- MongoDB tự động "unwind" logic khi match mảng: nếu **bất kỳ** phần tử trong
StockDetailscóProductName = "Product-1"thì document cha khớp - Kết quả trả về **toàn bộ document cha**, không chỉ phần tử khớp
Nếu chỉ muốn phần tử khớp: Dùng aggregate với $unwind + $match + $project (xem bài viết ID 1003071008).
Lưu ý MongoDB 4+: Hỗ trợ đầy đủ dot notation cho truy vấn sâu, kết hợp với index trên trường lồng nhau (createIndex({"ProductDetails.StockDetails.ProductName": 1})).