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

Lấy tất cả document chứa object cụ thể trong mảng MongoDB

Truy vấn document chứa object con trong mảng với dot notation

Sử dụng dot notation trực tiếp trong find() để tìm document có phần tử mảng khớp trường lồng.

1. Dữ liệu: mảng details chứa object Info lồng

> db.demo465.insertOne({
    id: 101,
    details: [
        { Name: "Chris", Info: { Subject: "MongoDB", Marks: 67 } },
        { Name: "David", Info: { Subject: "MySQL", Marks: 78 } }
    ]
});
> db.demo465.insertOne({
    id: 102,
    details: [
        { Name: "Bob", Info: { Subject: "Java", Marks: 45 } },
        { Name: "Carol", Info: { Subject: "C", Marks: 67 } }
    ]
});

2. Tìm document có details.Name = "Bob"

> db.demo465.find({ "details.Name": "Bob" });

3. Kết quả

{ 
    "_id": ObjectId("5e80421cb0f3fa88e2279062"),
    "id": 102,
    "details": [
        { "Name": "Bob", "Info": { "Subject": "Java", "Marks": 45 } },
        { "Name": "Carol", "Info": { "Subject": "C", "Marks": 67 } }
    ]
}

Cơ chế

  • "details.Name" kiểm tra từng phần tử trong mảng details
  • Nếu bất kỳ phần tử nào có Name == "Bob" → trả về toàn bộ document gốc
  • Không làm thay đổi cấu trúc mảng (khác với $elemMatch trong projection)

Truy vấn sâu hơn: Lọc cả Info.Subject

// Tìm document có học sinh tên Bob HỌC môn Java
db.demo465.find({ "details.Name": "Bob", "details.Info.Subject": "Java" });
// ⚠️ CẢNH BÁO: Có thể khớp Bob ở phần tử 1, Java ở phần tử 2!

// ĐÚNG: Dùng $elemMatch đảm bảo CÙNG 1 PHẦN TỬ
db.demo465.find({
    details: { $elemMatch: { Name: "Bob", "Info.Subject": "Java" } }
});

Projection: Chỉ trả về phần tử khớp

// Chỉ trả về phần tử details có Name="Bob"
db.demo465.find(
    { "details.Name": "Bob" },
    { "details.$": 1 }  // Positional projection
);
{
    "_id": ObjectId("..."),
    "details": [{ "Name": "Bob", "Info": { "Subject": "Java", "Marks": 45 } }]
}

Index cho dot notation trên mảng

db.demo465.createIndex({ "details.Name": 1 }); // Multikey index tự động