Trong MongoDB, có 2 trường hợp khác nhau khi tìm kiếm trường "rỗng": trường tồn tại nhưng giá trị null, và trường hoàn toàn không tồn tại.
Trường hợp 1: Trường tồn tại và giá trị = null
db.yourCollectionName.count({yourFieldName: null});
Trường hợp 2: Trường không tồn tại (missing field)
db.yourCollectionName.count({yourFieldName: {$exists: false}});
Ví dụ minh họa
Tạo collection và dữ liệu
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Larry","EmployeeAge":null,"EmployeeSalary":18500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a995c6cea1f28b7aa07fe") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Bob","EmployeeAge":21,"EmployeeSalary":23500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a99836cea1f28b7aa07ff") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Carol","EmployeeSalary":45500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a999b6cea1f28b7aa0800") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Mike","EmployeeAge":null,"EmployeeSalary":45500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a99bb6cea1f28b7aa0801") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Ramit","EmployeeSalary":85500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a99d76cea1f28b7aa0802") }
Xem tất cả documents
> db.fieldIsNullOrNotSetDemo.find().pretty();
{
"_id" : ObjectId("5c8a995c6cea1f28b7aa07fe"),
"EmployeeName" : "Larry",
"EmployeeAge" : null,
"EmployeeSalary" : 18500
}
{
"_id" : ObjectId("5c8a99836cea1f28b7aa07ff"),
"EmployeeName" : "Bob",
"EmployeeAge" : 21,
"EmployeeSalary" : 23500
}
{
"_id" : ObjectId("5c8a999b6cea1f28b7aa0800"),
"EmployeeName" : "Carol",
"EmployeeSalary" : 45500
}
{
"_id" : ObjectId("5c8a99bb6cea1f28b7aa0801"),
"EmployeeName" : "Mike",
"EmployeeAge" : null,
"EmployeeSalary" : 45500
}
{
"_id" : ObjectId("5c8a99d76cea1f28b7aa0802"),
"EmployeeName" : "Ramit",
"EmployeeSalary" : 85500
}
Trường hợp 1: EmployeeAge tồn tại và = null
> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: null});
4
Kết quả 4: Larry (null), Bob (21), Mike (null), Ramit (missing - MongoDB coi missing = null khi query bằng null).
Lưu ý quan trọng: Trong MongoDB, query
{field: null} khớp cả 2 trường hợp: trường có giá trị null VÀ trường không tồn tại. Đây là hành vi mặc định.
Trường hợp 2: EmployeeAge không tồn tại (chỉ missing, không tính null)
> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: {$exists: false}});
2
Kết quả 2: Carol và Ramit (2 document không có trường EmployeeAge).
Tóm tắt sự khác biệt
| Query | Khớp với | Ví dụ kết quả |
|---|---|---|
{age: null} | age = null HOẶC age missing | 4 document |
{age: {$exists: false}} | Chỉ age missing | 2 document |
{age: {$exists: true, $eq: null}} | Chỉ age = null (có trường) | 2 document (Larry, Mike) |
Best Practice
Để phân biệt rõ ràng, hãy dùng:
- Tìm null có trường:
{ field: { $exists: true, $eq: null } } - Tìm missing:
{ field: { $exists: false } } - Tìm cả hai:
{ field: null }(mặc định)