Giới thiệu
Để kiểm tra xem một tài liệu có chứa một trường cụ thể hay không (bất kể giá trị), bạn sử dụng toán tử $exists.
Cú pháp
// Trường tồn tại (kể cả null, "")
db.collection.find({ tenTruong: { $exists: true } });
// Trường KHÔNG tồn tại
db.collection.find({ tenTruong: { $exists: false } });
Ví dụ minh họa
1. Tạo dữ liệu: Một số doc có ClientAge, ClientCountryName, một số không
> db.kiemTraTonTai.insertOne({ "TenKhachHang": "John" });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb245d628fa4220163b75") }
> db.kiemTraTonTai.insertOne({ "TenKhachHang": "Larry", "TuoiKhachHang": 23 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb25cd628fa4220163b76") }
> db.kiemTraTonTai.insertOne({ "TenKhachHang": "Mike", "QuocGia": "UK" });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb26fd628fa4220163b77") }
> db.kiemTraTonTai.insertOne({ "TenKhachHang": "Sam", "TuoiKhachHang": 24 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb286d628fa4220163b78") }
2. Tìm doc CÓ trường TuoiKhachHang
> db.kiemTraTonTai.find({ TuoiKhachHang: { $exists: true } }).pretty();
3. Kết quả - 2 doc (Larry và Sam)
{ "_id" : ObjectId("5c9eb25cd628fa4220163b76"), "TenKhachHang" : "Larry", "TuoiKhachHang" : 23 }
{ "_id" : ObjectId("5c9eb286d628fa4220163b78"), "TenKhachHang" : "Sam", "TuoiKhachHang" : 24 }
4. Tìm doc CÓ trường QuocGia
> db.kiemTraTonTai.find({ QuocGia: { $exists: true } }).pretty();
{ "_id" : ObjectId("5c9eb26fd628fa4220163b77"), "TenKhachHang" : "Mike", "QuocGia" : "UK" }
Phân biệt: $exists vs $ne null
Đây là điểm quan trọng dễ nhầm lẫn:
| Document | { f: { $exists: true } } | { f: { $ne: null } } |
|---|---|---|
{ f: "value" } | ✅ Match | ✅ Match |
{ f: null } | ✅ Match (field tồn tại) | ❌ Không match |
{ f: "" } | ✅ Match | ✅ Match |
{ } (không có f) | ❌ Không match | ✅ Match! (missing ≠ null) |
Kết luận: Dùng $exists: true khi muốn kiểm tra sự tồn tại của field. Dùng $ne: null khi muốn loại trừ giá trị null (nhưng sẽ include doc missing field).
Kết hợp: Tồn tại VÀ có giá trị hợp lệ
// Tồn tại, không null, không rỗng
db.collection.find({
tenTruong: { $exists: true, $nin: [null, ""] }
});
Trong Aggregation
db.collection.aggregate([
{ $match: { tenTruong: { $exists: true } } },
{ $project: {
coTruong: { $cond: [ { $gt: [ { $strLenCP: { $ifNull: ["$tenTruong", ""] } }, 0 ] }, true, false ] }
} }
]);
Schema Validation (MongoDB 3.6+)
Để bắt buộc field phải tồn tại tại cấp schema:
db.createCollection("users", {
validator: {
$jsonSchema: {
required: ["email", "name"],
properties: {
email: { bsonType: "string" },
name: { bsonType: "string" }
}
}
}
});