$setWindowFields(窗口计算)
最后更新:2026-10-09
$setWindowFields(窗口计算)
$setWindowFields 按分区对文档做窗口计算——排名、移动平均、累计和等,并把结果写回每条文档。需要指定输出字段、窗口操作符(如 $rank、$denseRank 或累加器)和 sortBy 排序;window 可定义文档窗口或值范围窗口。类似 SQL 的窗口函数。
| 分类 | 分组与窗口 |
|---|---|
| MongoDB 版本 | 5.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $setWindowFields: { partitionBy: <表达式>, sortBy: { <字段>: <1 或 -1> }, output: { <字段>: { <窗口操作符>: ..., window: { documents: [...], range: [...] } } } } }
⚙️ 参数
| partitionBy | 分区表达式,未指定时全部文档为一个分区。 |
|---|---|
| sortBy | 分区内的排序规则,决定窗口计算顺序。 |
| output | 输出字段与窗口操作符定义。 |
返回值:附加窗口计算字段后的文档流
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $setWindowFields:按地区计算累计销售额
db.sales.aggregate([
{ $setWindowFields: {
partitionBy: '$region',
sortBy: { date: 1 },
output: {
runningTotal: { $sum: '$amount', window: { documents: ['unbounded', 'current'] } }
}
} }
])
运行结果:
// 每条销售记录附带运行累计额
{ "region": "EAST", "date": "2024-01-02", "amount": 30, "runningTotal": 30 }
📌 注意事项
- 至少需要一个输出字段,sortBy 与窗口操作符配合决定计算顺序
- 窗口范围可用 documents 或 range 两种方式指定
- partitionBy 未指定时把全部文档视为一个分区
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Q$setWindowFields 和 $group 有什么区别?
A$group 把一组文档压成一条;$setWindowFields 保留每条文档并把窗口计算结果写回该条。
Q能算移动平均吗?
A能,窗口设为前 7 条到 current,用 $avg 累加器即可。
Q窗口范围怎么写?
A如 { documents: ['unbounded', 'current'] } 表示从分区开头到当前文档,或用 range 按字段值区间。