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

Trả về document lồng nhau (embedded document) cụ thể trong MongoDB

Để 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:

  1. $unwind: "$Info1": Phân rã mảng Info1 → mỗi document chứa 1 phần tử Info1
  2. $unwind: "$Info1.Info2": Phân rã tiếp mảng Info2 bên trong → mỗi document chứa 1 phần tử Info2
  3. $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.