$substr(提取子串)
最后更新:2026-10-09
$substr(提取子串)
$substr 从字符串指定位置提取指定长度的子串。自 MongoDB 3.4 起,$substr 是 $substrCP 的别名,按 Unicode 码点(可理解为字符)计算位置,因此对中文、emoji 等多字节字符安全,不会截出半个字符。start 从 0 开始;start 为负数时返回空字符串,length 为负数时返回从 start 到结尾的子串。
| 分类 | 字符串 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $substr: [ <字符串表达式>, <起始位置>, <长度> ] }
⚙️ 参数
| 字符串 | 必填,源字符串表达式。 |
|---|---|
| 起始位置 | 必填,整数,从 0 开始;负数返回空字符串。 |
| 长度 | 必填,整数;负数返回从起始位置到结尾。 |
返回值:提取的子串;任一参数为 null 时返回 null。
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $substr:取手机号前 3 位
db.users.aggregate([
{ $project: { code: { $substr: [ '$phone', 0, 3 ] } } }
])
运行结果:
{ "_id": 1, "code": "138" }
{ "_id": 2, "code": "139" }
📌 注意事项
- 3.4 起等价于 $substrCP,按码点计数,多字节字符安全
- start 为负数返回空字符串,length 为负数返回剩余全部
- 需要按 UTF-8 字节截取时用 $substrBytes
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q$substr 和 $substrCP 一样吗?
A3.4 起 $substr 就是 $substrCP 的别名,行为一致。
Q截取中文会乱码吗?
A不会,按码点计算,中文安全。
Qstart 能给负数吗?
A能,此时返回空字符串。