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

Cách tìm kiếm bên trong object lồng nhau (hash/embedded document) trong MongoDB

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úcQueryMô 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