常用表达式
本教程共 50 篇 · 第 34 篇 · 更新于 2026-07-30 · 约 8 分钟阅读
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等运算符内部的字段引用同样要带$。漏写美元符是最常见的报错原因。
表达式让聚合真正「算起来」。下一章我们把前面所有阶段串起来,做一份完整的多集合统计报表。