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

Cách tìm tài liệu có chứa trường (field) bất kể giá trị trong MongoDB

Giới thiệu

Để tìm tất cả tài liệu chứa một trường cụ thể, bất kể giá trị của trường đó là gì (kể cả null, chuỗi rỗng, 0, false), bạn sử dụng toán tử $exists: true.

Cú pháp

db.tenCollection.find({ tenTruong: { $exists: true } });

Ví dụ minh họa

1. Tạo dữ liệu: Một số doc có StudentAge, một số không

> db.kiemTraTonTaiTruong.insertOne({"TenSinhVien":"John","TuoiSinhVien":null});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d1d60a629b87623db1b22") }
> db.kiemTraTonTaiTruong.insertOne({"TenSinhVien":"Larry","TuoiSinhVien":null});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d1d70a629b87623db1b23") }
> db.kiemTraTonTaiTruong.insertOne({"TenSinhVien":"Chris","TuoiSinhVien":""});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d1d7ba629b87623db1b24") }
> db.kiemTraTonTaiTruong.insertOne({"TenSinhVien":"Robert","TuoiSinhVien":""});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d1d81a629b87623db1b25") }

2. Tìm tất cả doc có trường TuoiSinhVien (kể cả null và "")

> db.kiemTraTonTaiTruong.find({ TuoiSinhVien: { $exists: true } });

3. Kết quả - trả về cả 4 tài liệu

{ "_id" : ObjectId("5c9d1d60a629b87623db1b22"), "TenSinhVien" : "John", "TuoiSinhVien" : null }
{ "_id" : ObjectId("5c9d1d70a629b87623db1b23"), "TenSinhVien" : "Larry", "TuoiSinhVien" : null }
{ "_id" : ObjectId("5c9d1d7ba629b87623db1b24"), "TenSinhVien" : "Chris", "TuoiSinhVien" : "" }
{ "_id" : ObjectId("5c9d1d81a629b87623db1b25"), "TenSinhVien" : "Robert", "TuoiSinhVien" : "" }

4. Chỉ lấy trường TuoiSinhVien (loại bỏ TenSinhVien)

> db.kiemTraTonTaiTruong.find(
    { TuoiSinhVien: { $exists: true } }, 
    { TenSinhVien: 0 }
);

Lưu ý quan trọng: $exists vs $ne null

Truy vấnTrả về doc có trườngTrả về doc KHÔNG có trường
{ truong: { $exists: true } }Có (kể cả null, "")Không
{ truong: { $ne: null } }Có (trừ null)Có (vì field missing ≠ null)

Quan trọng: Trong MongoDB, trường không tồn tại (missing) khác với trường tồn tại mà giá trị null. $ne: null sẽ trả về cả doc không có trường đó!

Kết hợp: Tồn tại VÀ không null/rỗng

db.collection.find({ 
    tenTruong: { $exists: true, $nin: [null, ""] } 
});