ใช้ $exists และ $eq ร่วมกัน เพื่อหาค่าว่าง string
เพื่อหาเอกสารที่ฟิลด์มีอยู่แต่เป็นค่าว่าง (empty string) ให้รวม $exists: true และ $eq: ""
ตัวอย่างข้อมูล
> 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": "" });
Query หา LastName ว่าง
> db.demo485.find({ "LastName": { $exists: true, $eq: "" } });
ผลลัพธ์
{ "_id": ObjectId(...), "FirstName": "Chris", "LastName": "" }
{ "_id": ObjectId(...), "FirstName": "Robert", "LastName": "" }
ความแตกต่าง: ว่าง vs ไม่มีฟิลด์ vs null
| Query | Match |
|---|---|
| { LastName: "" } | LastName = "" (empty string) **และ** LastName ไม่มี (legacy behavior) |
| { LastName: { $exists: true, $eq: "" } } | LastName มีอยู่ **และ** เป็น empty string เท่านั้น |
| { LastName: { $exists: false } } | LastName ไม่มีในเอกสาร |
| { LastName: null } | LastName = null **หรือ** ไม่มีฟิลด์ |
| { LastName: { $in: [null, ""] } } | LastName เป็น null หรือ empty string |
Best Practice: Schema Validation
db.createCollection("demo485", {
validator: {
$jsonSchema: {
properties: {
LastName: { bsonType: "string", minLength: 1 }
}
}
}
});
Aggregation สำหรับรายงาน
db.demo485.aggregate([
{ $project: { FirstName: 1, LastName: 1, isEmpty: { $eq: ["$LastName", ""] } } },
{ $group: { _id: "$isEmpty", count: { $sum: 1 }, names: { $push: "$FirstName" } } }
]);
Index สำหรับ Empty Field Query
// Partial index - index เฉพาะ non-empty
db.demo485.createIndex(
{ LastName: 1 },
{ partialFilterExpression: { LastName: { $ne: "" } } }
);