Vấn đề
Tìm document chứa giá trị cụ thể bên trong mảng đối tượng lồng nhau (nested array of objects) trong MongoDB.
Giải pháp: Dot Notation (ký hiệu chấm)
MongoDB cho phép truy cập trường trong mảng đối tượng bằng dot notation: "tenMang.tenTruong". Toán tử find() tự động "đệ quy" vào mảng để so khớp.
Ví dụ minh họa
1. Tạo collection với mảng đối tượng lồng nhau
> db.findOperationDemo.insertOne({
"ClientDetails": [
{"ClientId":101,"ClientName":"Chris"},
{"ClientId":102,"ClientName":"Robert"}
]
});
> db.findOperationDemo.insertOne({
"ClientDetails": [
{"ClientId":110,"ClientName":"David"},
{"ClientId":112,"ClientName":"Mike"}
]
});
2. Xem cấu trúc dữ liệu
> db.findOperationDemo.find().pretty();
Mỗi document có trường ClientDetails là mảng các object {ClientId, ClientName}.
3. Tìm document có ClientId = 110 bên trong mảng
> db.findOperationDemo.find({"ClientDetails.ClientId": 110});
4. Kết quả
{ "_id" : ObjectId("5cd9a12fb50a6c6dd317ad9a"),
"ClientDetails" : [
{"ClientId" : 110, "ClientName" : "David"},
{"ClientId" : 112, "ClientName" : "Mike"}
]
}
Trả về cả document chứa phần tử khớp (không chỉ phần tử khớp).
Mở rộng
- Kết hợp nhiều điều kiện:
{"ClientDetails.ClientId": 110, "ClientDetails.ClientName": "David"}(AND logic trên cùng một phần tử mảng - cần$elemMatchcho chính xác). - Dùng
$elemMatchkhi cần khớp nhiều trường trên cùng một phần tử mảng:{ClientDetails: {$elemMatch: {ClientId: 110, ClientName: "David"}}}. - Projection chỉ lấy phần tử khớp:
{$elemMatch: ...}trong projection.