Tìm document có trường rỗng (empty string) với $exists + $eq
Kết hợp $exists: true (trường tồn tại) và $eq: "" (giá trị là chuỗi rỗng) để lọc chính xác.
1. Dữ liệu: LastName có thể rỗng
> db.demo485.insertOne({ FirstName: "Chris", LastName: "" });
> db.demo485.insertOne({ FirstName: "David", LastName: "Miller" });
> db.demo485.insertOne({ FirstName: "Chris", LastName: "Brown" });
> db.demo485.insertOne({ FirstName: "Robert", LastName: "" });
2. Tìm LastName rỗng
> db.demo485.find({ "LastName": { "$exists": true, "$eq": "" } });
3. Kết quả
{ "_id": ObjectId("5e82e9f6b0f3fa88e22790a8"), "FirstName": "Chris", "LastName": "" }
{ "_id": ObjectId("5e82ea0fb0f3fa88e22790ab"), "FirstName": "Robert", "LastName": "" }
Tại sao cần $exists: true?
// Chỉ dùng $eq: "" → CŨNG khớp document KHÔNG CÓ trường LastName!
db.demo485.find({ LastName: "" });
// Trả về: Chris (""), Robert (""), VÀ David (KHÔNG CÓ LastName) ❌
// Cần $exists: true để loại trừ field missing
db.demo485.find({ LastName: { $exists: true, $eq: "" } });
// Chỉ trả về: Chris (""), Robert ("") ✅
Các trường hợp "rỗng" khác nhau
| Trường hợp | Query | Khớp |
|---|---|---|
| Chuỗi rỗng "" | { field: { $exists: true, $eq: "" } } | field: "" |
| Null | { field: null } | field: null, field: missing |
| Null (chỉ có null) | { field: { $in: [null], $exists: true } } | field: null |
| Missing (không có field) | { field: { $exists: false } } | không có field |
| Mảng rỗng [] | { field: { $size: 0 } } | field: [] |
| Object rỗng {} | { field: { $eq: {} } } | field: {} |
Ví dụ tổng hợp: Tìm "chưa có họ" (missing OR empty OR null)
db.demo485.find({
$or: [
{ LastName: { $exists: false } },
{ LastName: "" },
{ LastName: null }
]
});
Index cho truy vấn empty field
// Partial index: chỉ index doc CÓ LastName (bỏ qua missing)
db.demo485.createIndex(
{ LastName: 1 },
{ partialFilterExpression: { LastName: { $exists: true } } }
);
// Sparse index (legacy): chỉ index doc CÓ field (kể cả null, "")
db.demo485.createIndex({ LastName: 1 }, { sparse: true });
Validation schema (MongoDB 3.2+)
// Yêu cầu LastName tồn tại và không rỗng
db.createCollection("users", {
validator: {
$jsonSchema: {
required: ["LastName"],
properties: {
LastName: { bsonType: "string", minLength: 1 }
}
}
}
});