首页 / MongoDB 入门教程 / 常用表达式

MongoDB 入门教程

常用表达式

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

MongoDBMongoDB 入门教程聚合表达式dateToStringcondaddToSet

34. 常用表达式

本节目标:认识聚合里最常用的一类「表达式运算符」,能用日期、字符串、算术、条件表达式在管道中加工字段,让统计报表更丰富。

聚合不只是分组求和,还经常在 $project/$group 里对字段做转换。这些转换靠「表达式(Expression)」完成。表达式可以嵌套,绝大多数以 $ 开头。我们分四类来看。

db.orders.insertMany([
  { _id: 1001, user_id: 1, total: 657, status: "completed", created_at: ISODate("2024-06-01") },
  { _id: 1002, user_id: 2, total: 1099, status: "completed", created_at: ISODate("2024-03-15") },
  { _id: 1003, user_id: 1, total: 597, status: "shipped", created_at: ISODate("2024-11-20") }
])

日期表达式

从日期字段里取年、月,或格式化成字符串:

// 取出订单的年份和月份
db.orders.aggregate([
  {
    $project: {
      _id: 0,
      year: { $year: "$created_at" },
      month: { $month: "$created_at" }
    }
  }
])

$dateToString 可以自定义格式,类似其他语言的日期格式化:

// 格式化成 "2024-06-01" 这样的字符串
db.orders.aggregate([
  {
    $project: {
      _id: 0,
      dateStr: { $dateToString: { format: "%Y-%m-%d", date: "$created_at" } }
    }
  }
])
Note

日期表达式的参数用 date 指定来源字段。格式符里 %Y 是年、%m 是月、%d 是日,和常见格式化语法一致。

字符串表达式

拼字符串用 $concat,截取用 $substrCP,转大写用 $toUpper

// 给用户拼接一个展示名: "用户#1"
db.orders.aggregate([
  {
    $project: {
      _id: 0,
      label: { $concat: ["用户#", { $toString: "$user_id" }] }
    }
  }
])
// 把状态转成大写,并取前 4 个字符
db.orders.aggregate([
  {
    $project: {
      _id: 0,
      upper: { $toUpper: "$status" },
      short: { $substrCP: ["$status", 0, 4] }
    }
  }
])
Tip

$concat 要求所有片段都是字符串,数字要用 $toString 先转。不同字段类型拼接时这点最容易出错。

算术表达式

$add$multiply$divide 做加减乘除。多个操作数写成数组:

// 算含税金额(加 10%),再算人均(假设 2 人分摊)
db.orders.aggregate([
  {
    $project: {
      _id: 0,
      total: 1,
      withTax: { $multiply: ["$total", 1.1] },
      perPerson: { $divide: ["$total", 2] }
    }
  }
])

条件表达式 $cond

$cond 类似编程里的「三元运算符」:满足条件给 A,否则给 B。写法是 { $cond: { if, then, else } }

// 已完成标 "已付款",其余标 "未付款"
db.orders.aggregate([
  {
    $project: {
      _id: 0,
      total: 1,
      payState: {
        $cond: {
          if: { $eq: ["$status", "completed"] },
          then: "已付款",
          else: "未付款"
        }
      }
    }
  }
])
Note

$cond 也可以写成紧凑数组形式 [条件, 真值, 假值]。条件里常用 $eq$gt 等比较运算符。

$group 里的 $addToSet

上一章 $push 会把所有值收进数组(含重复)。$addToSet 只收「不重复」的值:

// 每个用户买过的不同状态有哪些(去重)
db.orders.aggregate([
  {
    $group: {
      _id: "$user_id",
      statuses: { $addToSet: "$status" }
    }
  }
])

表达式速查

类别表达式作用
日期$year/$month/$dateToString取年月、格式化
字符串$concat/$substrCP/$toUpper拼接、截取、大写
算术$add/$multiply/$divide加减乘除
条件$cond按条件取值
分组$addToSet去重收集
Warning

表达式里引用原字段必须带 $,如 "$total";而 $cond 等运算符内部的字段引用同样要带 $。漏写美元符是最常见的报错原因。

表达式让聚合真正「算起来」。下一章我们把前面所有阶段串起来,做一份完整的多集合统计报表。