$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 }

📌 注意事项

📚 相关教程

❓ 常见问题

Q$setWindowFields 和 $group 有什么区别?
A$group 把一组文档压成一条;$setWindowFields 保留每条文档并把窗口计算结果写回该条。
Q能算移动平均吗?
A能,窗口设为前 7 条到 current,用 $avg 累加器即可。
Q窗口范围怎么写?
A如 { documents: ['unbounded', 'current'] } 表示从分区开头到当前文档,或用 range 按字段值区间。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏