MongoDB聚合运算符:$sum

MongoDB聚合运算符:$sum


$sum聚合运算符返回数值的合计值,计算式 $sum会忽略非数值的值。

$sum适用于以下阶段:

  • $addFields阶段(从MongoDB3.4开始支持)
  • $bucket阶段
  • $budketAuto阶段
  • $group阶段
  • $match阶段的$expr表达式
  • $replaceRoot阶段(从MongoDB3.4开始支持)
  • $replaceWith阶段(从MongoDB4.2开始支持)
  • $set阶段(从MongoDB4.2开始支持)
  • $setWindowFields阶段(从MongoDB5.0开始支持)

语法

$sum用作累加器时,语法为:

{
   
    $sum: <expression> }

$sum用于非累加器时,语法为:

{
   
    $sum: [ <expression1>, <expression2> ... ]  }

使用

返回的数据类型

结果将与输入具有相同的类型,除非无法用该类型准确表示,在这些情况下:

  • 如果结果可表示为64位整数,则32位整数将转换为64位整数。
  • 如果结果无法表示为64位整数,则32位整数将转换为双精度型。
  • 如果结果不能表示为64位整数,则64位整数将转换为double。

非数值或缺失字段的处理

  • 如果用于同时包含数字值和非数字值的字段,$sum忽略非数字值并返回数字值的总和。
  • 如果用于集合中任何文档中都不存在的字段,则$sum会为该字段返回0
  • 如果所有操作数都是非数字,则$sum返回0

数组操作数

$group阶段,如果表达式解析为数组,$sum会将操作数视为非数字值,对于其他支持的阶段:

  • 当使用单个表达式作为操作数,如果表达式解析为数组,则$sum会遍历数组,对数字元素进行操作,返回累加值。
  • 当使用表达式列表作为操作数,如果表达式解析为数组,$sum不会遍历数组,而是将数组视为非数字值。

举例

应用于$group阶段

sales集合有以下文档:

{
   
    "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") }
{
   
    "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") }
{
   
    "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") }
{
   
    "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }
{
   
    "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:05:00Z") }

下面的聚合根据date字段的日和年对文档进行分组,使用$sum累加器计算每组文档的总金额和计数:

db.sales.aggregate(
   [
     {
   
   
       $group:
         {
   
   
           _id: {
   
    day: {
   
    $dayOfYear: "$date"}, year: {
   
    $year: "$date" } },
           totalAmount: {
   
    $sum
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值