$slice(截取数组子集)
最后更新:2026-10-09
$slice(截取数组子集)
$slice 从数组中截取一部分元素,支持两种写法:两参数形式取前 n 个元素(n 为负则取最后 n 个),三参数形式先跳过若干元素再取指定数量。典型场景包括分页展示评论、取最近几条订单记录、限制返回的标签数量。它返回新数组,不修改原数组;参数为 null 时返回 null。与字符串的 $substr 思路类似,但只作用于数组。
| 分类 | 数组 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $slice: [ <数组>, <数量> ] } 或 { $slice: [ <数组>, <跳过>, <数量> ] }
⚙️ 参数
| 数组 | 要截取的数组。 |
|---|---|
| 数量 | 要取的元素个数;两参数形式中为负表示从末尾取最后 n 个。 |
| 跳过 | 可选,三参数形式中先跳过的元素个数;为负表示从末尾倒数作为起点。 |
返回值:截取出的子数组;参数为 null 时返回 null
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $slice:取前 3 个标签
db.posts.aggregate([
{ $project: {
topTags: { $slice: ['$tags', 3] }
} }
])
运行结果:
{ '_id': 1, 'topTags': [ 'mongo', 'db', 'nosql' ] }
📌 注意事项
- 两参数形式 [数组, n]:n 为正取前 n 个,n 为负取最后 n 个
- 三参数形式 [数组, 跳过, 数量]:跳过为负时从数组末尾倒数作为起点
- 截取超过数组长度不会报错,只返回实际存在的元素
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Q$slice 怎么取数组最后几个元素?
A用负数量,如 { $slice: ['$arr', -3] } 取最后 3 个。
Q$slice 支持分页吗?
A支持,三参数形式 { $slice: ['$arr', 10, 10] } 跳过 10 个再取 10 个。
Q截取数量超过数组长度会报错吗?
A不会,返回实际存在的元素,不会补 null。