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

Cách truy vấn giá trị lồng nhau (nested) trong MongoDB

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úcTruy 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" });