Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Truy vấn lồng nhau (nested query) MongoDB 4 lấy document cụ thể

Để 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 StockDetails có 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})).