MongoDB 8.3 的 arrayIndexAs 把「带下标 map」变通做法的开销砍掉最多 31%
来源:dev.to — 2026-10-11
📋 概述
MongoDB 的 $map、$filter 与 $reduce 从来不给当前元素的位置。如果你需要知道现在处理的是下标 0 还是 4999,只能自己造——通常是对 $range(0, $size(arr)) 做映射,再用 $arrayElemAt 把每个值取回来。8.3 新增的 arrayIndexAs 字段直接把下标交给 $map,不再需要额外阶段。发布说明把它描述为一处便利性改动,作者想弄清旧写法到底让人付出了多少代价,于是用同一份数据跑两种模式做对比:两者输出逐文档完全一致,在 32 万元素规模下服务端耗时约 134 毫秒对 102 毫秒,差距最高约 31%;但当十个客户端抢同一批 CPU 核心时,这个差距会缩到约 5%。
🔑 核心要点
- 8.3 之前要在 $map 里拿到下标,必须对 $range(0, $size(arr)) 映射再用 $arrayElemAt 取值。
- 新增的 arrayIndexAs 直接把下标交给 $map,省掉这一轮往返,两者输出逐文档一致。
- 32 万元素规模下服务端耗时约 134 毫秒对 102 毫秒,差距最高约 31%。
- 十个客户端竞争同一批 CPU 核心时,这个差距缩到约 5%。
- 关键前提是作者先逐文档核对输出一致,才敢相信任何计时数字。
💡 金句
我先逐文档核对了两种写法输出完全一致,才敢相信任何一个计时数字。
👍 0
👎 0
← 返回 dev.to 首页