Giới thiệu
Trong MongoDB, "hash" thường ám chỉ embedded document (document lồng nhau). Để truy vấn bên trong object lồng nhau, bạn sử dụng **dot notation** (ký pháp dấu chấm).
Cú pháp
db.collection.find({ "truongCha.truongCon": giaTri });
Ví dụ minh họa
1. Tạo collection với embedded document
> db.timTrongObject.insertOne({
"TenKhachHang": "Larry",
"TuoiKhachHang": 23,
"ChiTietKhachHang": { "DaCoHocVan": true, "DuAn": "University Management" }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ca1ef1266324ffac2a7dc5e") }
> db.timTrongObject.insertOne({
"TenKhachHang": "Chris",
"TuoiKhachHang": 26,
"ChiTietKhachHang": { "DaCoHocVan": false, "DuAn": "Online Book Store" }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ca1ef7766324ffac2a7dc5f") }
2. Tìm: DaCoHocVan = false VÀ DuAn = "Online Book Store"
> db.timTrongObject.find({
"ChiTietKhachHang.DaCoHocVan": false,
"ChiTietKhachHang.DuAn": "Online Book Store"
}).pretty();
3. Kết quả
{ "_id" : ObjectId("5ca1ef7766324ffac2a7dc5f"), "TenKhachHang" : "Chris", "TuoiKhachHang" : 26, "ChiTietKhachHang" : { "DaCoHocVan" : false, "DuAn" : "Online Book Store" } }
Các trường hợp dot notation phổ biến
| Cấu trúc | Query | Mô tả |
|---|---|---|
{ a: { b: 1 } } | { "a.b": 1 } | 1 cấp lồng nhau |
{ a: { b: { c: 1 } } } | { "a.b.c": 1 } | Nhiều cấp |
{ arr: [ { x: 1 } ] } | { "arr.x": 1 } | Mảng object - bất kỳ element |
{ arr: [ { x: 1 } ] } | { "arr.0.x": 1 } | Element cụ thể index 0 |
Kết hợp với toán tử query
// So sánh
db.collection.find({ "user.profile.age": { $gt: 18 } });
// Regex
db.collection.find({ "user.profile.name": { $regex: "^A" } });
// $in
db.collection.find({ "user.address.city": { $in: ["HN", "HCM"] } });
// $exists
db.collection.find({ "user.profile.phone": { $exists: true } });
Projection: Chỉ lấy nested field
db.collection.find(
{ "ChiTietKhachHang.DuAn": "Online Book Store" },
{ _id: 0, "ChiTietKhachHang.DaCoHocVan": 1 }
);
Index trên nested field
// Single field
db.collection.createIndex({ "ChiTietKhachHang.DuAn": 1 });
// Compound
db.collection.createIndex({
"ChiTietKhachHang.DaCoHocVan": 1,
"ChiTietKhachHang.DuAn": 1
});
Lưu ý
- Dot notation **luôn trong ngoặc kép**:
"parent.child" - MongoDB không có khái niệm "hash" như Redis - đây là embedded document
- Document lồng nhau có giới hạn 16MB (kích thước document tối đa)
- Cân nhắc normalize (tách collection) nếu nested data lớn, thường xuyên cập nhật riêng