对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

$sum(窗口函数)

$sum

返回特定窗口中文档的数值总和。

注意

$sum 的其他用途

本页介绍了用作窗口函数的 $sum。

您还可以在其他上下文中使用 $sum:

{
$setWindowFields: {
...
output: {
<field>: {
$sum: <expression>
}
}
}
}

当混合输入类型时,$sum 会将较小的输入类型提升为两者中较大的输入类型。当表示更范围的值时,该类型被认为更大。数值类型从小到大的顺序是:整数 → 长整型 → 双精度浮点数 → 十进制。

较大的输入类型也决定了结果类型,除非操作溢出,超出了较大数据类型所代表的范围。在溢出的情况下,$sum 按照以下顺序推送结果:

如果窗口中的某些文档具有该字段的 null 值或缺少该字段,则 $sum 会忽略这些值并对其余值求和。

如果窗口中的所有文档都具有该字段的 null 值或缺少该字段,则 $sum 返回 0。

本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。

此示例使用 $setWindowFields 计算 2009 和 2010 中每部音乐剧电影的运行累积投票总数。每个文档都会收到从其年度分区开始到当前文档计算得出的 $sum 值。

db.movies.aggregate( [
{
$match: {
genres: "Musical",
year: { $in: [ 2009, 2010 ] },
"imdb.rating": { $type: "double" },
"imdb.votes": { $gt: 0 }
}
},
{
$setWindowFields: {
partitionBy: "$year",
sortBy: { title: 1 },
output: {
cumulativeVotesInYear: {
$sum: "$imdb.votes",
window: {
documents: [ "unbounded", "current" ]
}
},
rankInYear: {
$documentNumber: {}
}
}
}
},
{
$project: {
_id: 0,
title: 1,
year: 1,
"imdb.votes": 1,
cumulativeVotesInYear: 1,
rankInYear: 1
}
},
{ $sort: { year: 1, title: 1 } }
] )

上述管道:

  • 使用 $match 从 2009 和 2010 中过滤具有 IMDb 数字评分和至少一票的音乐剧电影。

  • 使用 $setWindowFields 按 year 对电影进行分区,并按 title 进行排序。该阶段使用 $sum 和文档窗口[ "unbounded", "current" ] 为每个文档创建以下字段:

    • cumulativeVotesInYear:imdb.votes 的运行累积和。

    • rankInYear:由 $documentNumber 分配的每个分区的行号。

  • 使用 $project 在输出中包含 title、year、imdb.votes、cumulativeVotesInYear 和 rankInYear。

  • 使用 $sort 按年份和标题对结果进行排序。

给本页内容打分