$arrayElemAt(按索引取数组元素)
最后更新:2026-10-09
$arrayElemAt(按索引取数组元素)
$arrayElemAt 按索引从数组中取出对应位置的元素,是聚合表达式里按位置访问数组的核心操作符。它常用于取出订单的第一个商品、取数组最后一个元素、或在 $project 中展开数组的某一位。索引从 0 开始计数,负数索引从数组末尾倒数,越界时返回 null 而不是报错。与 $first/$last 相比,$arrayElemAt 可以取任意位置,灵活度更高。
| 分类 | 数组 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $arrayElemAt: [ <数组>, <索引> ] }
⚙️ 参数
| 数组 | 要取元素的数组或解析为数组的表达式。 |
|---|---|
| 索引 | 整数索引;负数从末尾倒数,-1 为最后一个元素。 |
返回值:指定位置的元素;索引越界或数组为 null 时返回 null
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $arrayElemAt:取订单的第一个商品
db.orders.aggregate([
{ $project: {
firstItem: { $arrayElemAt: ['$items', 0] }
} }
])
运行结果:
{ '_id': 1, 'firstItem': { 'sku': 'A01', 'qty': 2 } }
{ '_id': 2, 'firstItem': { 'sku': 'B02', 'qty': 1 } }
📌 注意事项
- 索引从 0 开始;取最后一个元素用 -1,不必先 $size 再减一
- 越界访问返回 null 不会报错,需要兜底可配合 $ifNull
- 与 $first/$last 的区别:$arrayElemAt 能取任意位置,$first/$last 只能取两端
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q$arrayElemAt 怎么取数组最后一个元素?
A用 -1 作为索引即可,例如 { $arrayElemAt: ['$arr', -1] },无需先计算长度。
Q索引越界会报错吗?
A不会,越界返回 null。可用 $ifNull 提供默认值。
Q$arrayElemAt 和 $first 有什么区别?
A$first 固定取第一个元素,$arrayElemAt 可指定任意索引(含负数),更灵活。