Giới thiệu
Để truy vấn giá trị trong đối tượng lồng nhau (embedded document), MongoDB sử dụng dot notation (ký pháp dấu chấm): "truongNgoai.truongTrong".
Ví dụ minh họa
1. Tạo collection với document lồng nhau
> db.truyVanNested.insertOne({
"TenNhanVien": "John",
"ChiTietNhanVien": {
"_id": "EMP-101",
"TuoiNhanVien": 23,
"TenCongTy": "IBM"
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ea31dd628fa4220163b69") }
> db.truyVanNested.insertOne({
"TenNhanVien": "Carol",
"ChiTietNhanVien": {
"_id": "EMP-110",
"TuoiNhanVien": 29,
"TenCongTy": "Amazon"
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ea36bd628fa4220163b6a") }
2. Xem dữ liệu
> db.truyVanNested.find().pretty();
{ "_id" : ObjectId("5c9ea31dd628fa4220163b69"), "TenNhanVien" : "John", "ChiTietNhanVien" : { "_id" : "EMP-101", "TuoiNhanVien" : 23, "TenCongTy" : "IBM" } }
{ "_id" : ObjectId("5c9ea36bd628fa4220163b6a"), "TenNhanVien" : "Carol", "ChiTietNhanVien" : { "_id" : "EMP-110", "TuoiNhanVien" : 29, "TenCongTy" : "Amazon" } }
3. Truy vấn nested field: Tìm nhân viên có ChiTietNhanVien._id = "EMP-110"
> db.truyVanNested.find({ "ChiTietNhanVien._id": "EMP-110" }).pretty();
4. Kết quả
{ "_id" : ObjectId("5c9ea36bd628fa4220163b6a"), "TenNhanVien" : "Carol", "ChiTietNhanVien" : { "_id" : "EMP-110", "TuoiNhanVien" : 29, "TenCongTy" : "Amazon" } }
Các trường hợp dot notation thường gặp
| Cấu trúc | Truy vấn | Ý nghĩa |
|---|---|---|
| { a: { b: { c: 1 } } } | { "a.b.c": 1 } | Truy cập 3 cấp lồng nhau |
| { arr: [ { x: 1 }, { x: 2 } ] } | { "arr.x": 1 } | Truy cập field trong array of objects |
| { arr: [ { x: 1 }, { x: 2 } ] } | { "arr.0.x": 1 } | Truy cập element cụ thể trong array (index 0) |
Lưu ý quan trọng
- Dot notation phải đặt trong ngoặc kép:
"outer.inner" - Khác với JavaScript:
doc.outer.inner(không cần ngoặc) - Dùng với find(), update(), aggregation $match, $project, $group...
- Index trên nested field:
db.coll.createIndex({ "ChiTietNhanVien._id": 1 })
Ví dụ nâng cao: Query trong mảng object
// Tìm doc có bất kỳ element nào trong "orders" có status = "shipped"
db.users.find({ "orders.status": "shipped" });
// Tìm doc có element index 0 trong "orders" có status = "shipped"
db.users.find({ "orders.0.status": "shipped" });