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

Cách tìm tài liệu theo tên trường lồng nhau với giá trị cụ thể trong MongoDB

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: true kiể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 })