首页 / MongoDB 入门教程 / 元素与评估运算符

MongoDB 入门教程

元素与评估运算符

本教程共 50 篇 · 第 16 篇 · 更新于 2026-07-30 · 约 8 分钟阅读

MongoDBMongoDB 入门教程元素运算符$exists$type$regex$expr

16. 元素与评估运算符

本节目标:用 $exists 判断字段是否存在、$type 按类型筛选,用 $mod、$regex、$expr 做取模、正则和文档内字段比较这类更灵活的匹配。

16.1 先加一条缺字段的数据

为演示「字段是否存在」,往 users 插一条没有 email 字段的:

db.users.insertOne({
  _id: 6,
  name: "测试无邮箱",
  age: 19,
  city: "成都",
  tags: ["new"]
})

现在集合里有带 email 和不带 email 的两种文档。

16.2 $exists:字段是否存在

$exists: true 匹配「有这个字段」的文档;false 匹配「没有这个字段」的:

// 找出没有 email 字段的用户
db.users.find({ email: { $exists: false } }).pretty()
// 找出有 email 字段的用户
db.users.find({ email: { $exists: true } }).pretty()
Tip

灵活 Schema 下,同一集合字段可能不齐。$exists 常用来清理「老数据缺字段」的情况,或校验数据完整性。

16.3 $type:按数据类型匹配

$type 用 BSON 类型的别名筛选。比如只找年龄是双精度数字的:

// age 是 double 类型
db.users.find({ age: { $type: "double" } }).pretty()

也可以匹配多种类型,或用一个概括别名:

// "number" 会匹配 int / double / long / decimal 任意数字类型
db.users.find({ age: { $type: "number" } }).pretty()
Note

据 MongoDB 8.3 官方文档,$type 支持字符串别名(如 doublestringobjectIddatedecimal)和整数编号,number 是同时匹配多种数字类型的便捷别名。

16.4 $mod:取模匹配

$mod: [除数, 余数] 用来找「除以除数余数为某值」的字段:

// 找 age 是 10 的整数倍(age % 10 == 0)
db.users.find({ age: { $mod: [10, 0] } }).pretty()

对示例数据,只有 30 这个整十的年龄会被挑出来。

16.5 $regex:正则匹配

$regex 做字符串模式匹配,比如名字以「张」开头:

// 名字以「张」开头
db.users.find({ name: { $regex: /^张/ } }).pretty()

i 忽略大小写:

// 忽略大小写匹配包含 mongo 的邮箱
db.users.find({ email: { $regex: /MONGO/i } }).pretty()

也支持直接写正则字面量:

db.users.find({ name: /张/ }).pretty()

16.6 $expr:文档内字段比较

$expr 允许在查询里写聚合表达式,比较「同一个文档的多个字段」。基础语法:

// 等价 age > 25,但用 $expr 展示写法
db.users.find({ $expr: { $gt: ["$age", 25] } }).pretty()

更实用的场景是两个字段比大小。假设文档同时有 agemin_age

// 找出 age 大于自身 min_age 的文档(示意)
db.users.find({ $expr: { $gt: ["$age", "$min_age"] } }).pretty()
Warning

$expr 里的字段要写成字符串加 $ 前缀(如 "$age"),不是裸字段名。漏掉 $ 会查不到或报错。

16.7 小结

  • 关心「有没有这个字段」:$exists。
  • 关心「是什么类型」:$type。
  • 关心「能否整除 / 匹配模式 / 字段互比」:$mod / $regex / $expr。