本文介绍如何在 MongoDB 中精确查找字段值为 null 的文档,使用 $type 操作符配合 BSON Type Number 10 (Alias: "null")。
BSON 类型对照表
| 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" |
语法
// 使用数字
db.yourCollectionName.find({ "yourFieldName": { $type: 10 } });
// 使用别名 (推荐,可读性更好)
db.yourCollectionName.find({ "yourFieldName": { $type: "null" } });
创建示例数据(包含各种「空」值)
> 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") }
显示所有数据
> db.mongoDbEqualDemo.find().pretty();
{ "_id" : ObjectId("5cd7e9121a844af18acdffa3"), "Age" : 34 }
{ "_id" : ObjectId("5cd7e9161a844af18acdffa4"), "Age" : "" }
{ "_id" : ObjectId("5cd7e9191a844af18acdffa5"), "Age" : null }
{ "_id" : ObjectId("5cd7e91e1a844af18acdffa6"), "Age" : 56 }
{ "_id" : ObjectId("5cd7e9261a844af18acdffa7") }
{ "_id" : ObjectId("5cd7e92e1a844af18acdffa8"), "Age" : null }
精确查找 Age = null 的文档
> db.mongoDbEqualDemo.find({"Age":{ $type: 10 }});
结果(仅 2 个真正的 null)
{ "_id" : ObjectId("5cd7e9191a844af18acdffa5"), "Age" : null }
{ "_id" : ObjectId("5cd7e92e1a844af18acdffa8"), "Age" : null }
关键区别:null vs 空字符串 vs 字段不存在
| 情况 | 文档示例 | {Age: null} | {Age: {$type:10}} | {Age: {$exists: false}} |
| 显式 null | {Age: null} | ✅ 匹配 | ✅ 匹配 | ❌ |
| 空字符串 | {Age: ""} | ❌ | ❌ | ❌ |
| 字段不存在 | { } | ❌ | ❌ | ✅ 匹配 |
| 数值 0 | {Age: 0} | ❌ | ❌ | ❌ |
组合查询:null 或不存在
// 查找 Age 为 null 或字段不存在
db.mongoDbEqualDemo.find({
$or: [
{ Age: { $type: 10 } },
{ Age: { $exists: false } }
]
});
更新时处理 Null
// 将 null 替换为默认值
db.collection.updateMany(
{ age: { $type: 10 } },
{ $set: { age: 0 } }
);
// 删除 null 字段
db.collection.updateMany(
{ age: { $type: 10 } },
{ $unset: { age: "" } }
);