Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB 检查 Null 值:使用 $type 操作符 (Type 10)

本文介绍如何在 MongoDB 中精确查找字段值为 null 的文档,使用 $type 操作符配合 BSON Type Number 10 (Alias: "null")。

BSON 类型对照表

TypeNumberAlias
Double1"double"
String2"string"
Object3"object"
Array4"array"
Binary data5"binData"
Undefined6"undefined"
ObjectId7"objectId"
Boolean8"bool"
Date9"date"
Null10"null"
Regular Expression11"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 字段不存在

组合查询: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: "" } }
);
情况文档示例{Age: null}{Age: {$type:10}}{Age: {$exists: false}}
显式 null{Age: null}✅ 匹配✅ 匹配❌
空字符串{Age: ""}❌❌❌
字段不存在{ }❌❌✅ 匹配
数值 0{Age: 0}❌❌❌