定义
返回特定窗口中文档的数值总和。
注意
$sum 的其他用途
本页介绍了用作窗口函数的 $sum。
您还可以在其他上下文中使用 $sum:
$sum (accumulator),返回一群组文档中数值的总和。$sum (expression),返回大量中数值的总和。
语法
{ $setWindowFields: { ... output: { <field>: { $sum: <expression> } } } }
行为
结果类型
当混合输入类型时,$sum 会将较小的输入类型提升为两者中较大的输入类型。当表示更范围的值时,该类型被认为更大。数值类型从小到大的顺序是:整数 → 长整型 → 双精度浮点数 → 十进制。
较大的输入类型也决定了结果类型,除非操作溢出,超出了较大数据类型所代表的范围。在溢出的情况下,$sum 按照以下顺序推送结果:
如果较大的类型为
double或decimal,则溢出结果表示为正无穷大或负无穷大。结果没有类型提升。
空值或缺失值
如果窗口中的某些文档具有该字段的 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按年份和标题对结果进行排序。