$accumulator(自定义累加器)
最后更新:2026-10-09
$accumulator(自定义累加器)
$accumulator 用自定义 JavaScript 函数定义累加器逻辑,支持 init、accumulate、merge、finalize 等回调,在 $group 中使用。它可以实现内置累加器无法表达的复杂聚合逻辑。注意:它运行在服务器端 JavaScript 上,性能低于内置累加器。
| 分类 | 累加器 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $accumulator: { init: <函数>, accumulate: <函数>, accumulateArgs: [ <表达式> ], merge: <函数>, finalize: <函数>, lang: "js" } }
返回值:自定义累加结果(类型由用户函数决定)
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $accumulator:用 Set 统计组内不同价格的数量
db.sales.aggregate([
{ $group: { _id: '$item', uniq: {
$accumulator: {
init: function() { return new Set(); },
accumulate: function(set, v) { set.add(v); },
accumulateArgs: ['$price'],
merge: function(a, b) { for (var v of b) a.add(v); },
finalize: function(set) { return set.size; },
lang: 'js'
}
} }
])
运行结果:
// 每个商品的去重价格数量
📌 注意事项
- 运行在服务器端 JavaScript 上,性能低于内置累加器
- 回调必须可序列化,不能引用外部变量
- merge 回调用于分片或分布式环境合并各组结果
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q$accumulator 性能怎么样?
A服务器端 JS 执行,比内置累加器慢,能不用就不用。
Q回调函数有哪几个?
Ainit、accumulate、accumulateArgs 必填,merge、finalize 按需提供。
Q服务器不支持 JavaScript 怎么办?
A会报错,需要管理员启用服务端脚本支持后再使用。