Giới thiệu
Để tìm tài liệu có chứa một trường lồng nhau (nested field) cụ thể, bạn kết hợp dot notation với toán tử $exists.
Ví dụ minh họa
1. Tạo dữ liệu với cấu trúc lồng nhau khác nhau
> db.timTheoTruongNested.insertOne({
"KhachHang": {
"ThongTinKhachHang": { "TenKhachHang": "Larry", "TuoiKhachHang": 29 },
"ThongTinDuAn": { "TenDuAn": "Online Book Store", "KichThuocDoi": 10, "CongNghe": "Spring Boot" }
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9e93b2d628fa4220163b64") }
> db.timTheoTruongNested.insertOne({
"KhachHang": {
"ThongTinKhachHang": { "TenKhachHang": "Chris", "TuoiKhachHang": 27 },
"ThongTinGiaoDuc": { "DaCoHocVan": true, "TenTruong": "M.I.T." }
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9e9421d628fa4220163b65") }
2. Tìm tài liệu CÓ trường "KhachHang.ThongTinDuAn"
> db.timTheoTruongNested.find({ "KhachHang.ThongTinDuAn": { $exists: true } }).pretty();
3. Kết quả - chỉ trả về document đầu tiên (Larry)
{ "_id" : ObjectId("5c9e93b2d628fa4220163b64"), "KhachHang" : { "ThongTinKhachHang" : { "TenKhachHang" : "Larry", "TuoiKhachHang" : 29 }, "ThongTinDuAn" : { "TenDuAn" : "Online Book Store", "KichThuocDoi" : 10, "CongNghe" : "Spring Boot" } } }
Mở rộng: Tìm theo giá trị cụ thể trong nested field
Tìm dự án có TenDuAn = "Online Book Store"
> db.timTheoTruongNested.find({ "KhachHang.ThongTinDuAn.TenDuAn": "Online Book Store" }).pretty();
Tìm khách hàng có DaCoHocVan = true
> db.timTheoTruongNested.find({ "KhachHang.ThongTinGiaoDuc.DaCoHocVan": true }).pretty();
Projection: Chỉ lấy nested field cần thiết
> db.timTheoTruongNested.find(
{ "KhachHang.ThongTinDuAn": { $exists: true } },
{ "KhachHang.ThongTinKhachHang": 0 } // Loại bỏ trường này
).pretty();
Kết hợp $exists với điều kiện giá trị
// Tồn tại TRƯỜNG VÀ giá trị thỏa mãn điều kiện
db.collection.find({
"outer.inner": { $exists: true, $eq: "someValue" }
});
// Hoặc tách riêng (tương đương)
db.collection.find({
"outer.inner": "someValue"
// $exists: true ngầm hiểu khi so sánh giá trị
});
Lưu ý
$exists: truekiểm tra sự tồn tại của field, kể cả khi giá trị là null- Dot notation bắt buộc trong ngoặc kép:
"outer.inner" - Index trên nested field:
db.coll.createIndex({ "KhachHang.ThongTinDuAn.TenDuAn": 1 })