MongoDB sử dụng toán tử $type với mã loại 10 (hoặc alias "null") để kiểm tra trường có giá trị null (BSON type null). Điều này khác với trường không tồn tại (missing) hoặc chuỗi rỗng.
Bảng loại BSON Type
| Type | Number | Alias |
|---|---|---|
| Double | 1 | "double" |
| String | 2 | "string" |
| Object | 3 | "object" |
| Array | 4 | "array" |
| Binary data | 5 | "binData" |
| Undefined | 6 | "undefined" |
| ObjectId | 7 | "objectId" |
| Boolean | 8 | "bool" |
| Date | 9 | "date" |
| Null | 10 | "null" |
| Regular Expression | 11 | "regex" |
Cú pháp kiểm tra null
db.yourCollectionName.find({"yourFieldName": { $type: 10 }});
Hoặc dùng alias (khuyên dùng):
db.yourCollectionName.find({"yourFieldName": { $type: "null" }});
Tạo dữ liệu mẫu (các trường hợp edge case)
> db.mongoDbEqualDemo.insertOne({"Age":34});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7e9121a844af18acdffa3") }
> db.mongoDbEqualDemo.insertOne({"Age":""});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7e9161a844af18acdffa4") }
> db.mongoDbEqualDemo.insertOne({"Age":null});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7e9191a844af18acdffa5") }
> db.mongoDbEqualDemo.insertOne({"Age":56});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7e91e1a844af18acdffa6") }
> db.mongoDbEqualDemo.insertOne({});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7e9261a844af18acdffa7") }
> db.mongoDbEqualDemo.insertOne({"Age":null});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7e92e1a844af18acdffa8") }
Xem dữ liệu
> db.mongoDbEqualDemo.find().pretty();
Truy vấn chỉ lấy Age = null (type 10)
> db.mongoDbEqualDemo.find({"Age": { $type: 10 }});Kết quả
Phân biệt các trường hợp
| Trường hợp | Giá trị | {$type: 10} | {$eq: null} | {$exists: false} |
|---|---|---|---|---|
| Null explicit | null | ✅ Khớp | ✅ Khớp | ❌ |
| Chuỗi rỗng | "" | ❌ | ❌ | ❌ |
| Số 0 | 0 | ❌ | ❌ | ❌ |
| Trường không tồn tại | (missing) | ❌ | ✅ Khớp! | ✅ Khớp |
| Undefined | undefined | ❌ (type 6) | ❌ | ❌ |
⚠️ Lưu ý quan trọng: $eq: null vs $type: 10
{Age: {$eq: null}}: Khớp CẢ null explicit VÀ trường không tồn tại (missing){Age: {$type: 10}}: CHỈ khớp null explicit (BSON type 10)- Để tìm "null hoặc missing":
{$or: [{Age: {$type: 10}}, {Age: {$exists: false}}]}
Trong Aggregation
Ứng dụng thực tế
- Data quality: Phát hiện record thiếu dữ liệu bắt buộc
- Migration: Xác định record cần backfill
- Validation: Đảm bảo trường optional thực sự null chứ không phải missing