Database Manual / Reference / Query Language / Expressions

$add (expression operator)(表达式运算符)

Definition定义

$add

Adds numbers together or adds numbers and a date. If one of the arguments is a date, $add treats the other arguments as milliseconds to add to the date.将数字相加或将数字和日期相加。如果其中一个参数是日期,$add会将其他参数视为添加到日期的毫秒数。

The $add expression has the following syntax:$add表达式具有以下语法:

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

The arguments can be any valid expression as long as they resolve to either all numbers or to numbers and a date. 参数可以是任何有效的表达式,只要它们解析为所有数字或数字和日期。For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式

Starting in MongoDB 6.1 you can optimize the $add operation. To improve performance, group references at the end of the argument list. For example,从MongoDB 6.1开始,您可以优化$add操作。为了提高性能,请将引用分组到参数列表的末尾。例如,

$add: [ 1, 2, 3, '$a', '$b', '$c' ]

Behavior行为

When input types are mixed, $add promotes the smaller input type to the larger of the two. A type is considered larger when it represents a wider range of values. The order of numeric types from smallest to largest is:当输入类型混合时,$add会将较小的输入类型升级为较大的输入类型。当一个类型代表更宽的值范围时,它被认为更大。数字类型从最小到最大的顺序是: integer → long → double → decimal

The larger of the input types also determines the result type unless the operation overflows and is beyond the range represented by that larger data type. In cases of overflow, $add promotes the result according to the following order:较大的输入类型也决定了结果类型,除非操作溢出并且超出了较大数据类型表示的范围。在溢出的情况下,$add会按照以下顺序提升结果:

  • If the larger input type is integer, the result type is promoted to long.如果较大的输入类型是integer,则结果类型将提升为long
  • If the larger input type is long, the result type is promoted to double.如果较大的输入类型是long,则结果类型将提升为double
  • If the larger type is double or decimal, the overflow result is represented as + or - infinity. There is no type promotion of the result.如果较大的类型是doubledecimal,则溢出结果表示为+infinity-infinity。结果没有类型提升。

When mixing Date and non-integer operands, $add rounds the non-integer value to the nearest integer before performing the operation.当混合Date和非整数操作数时,$add会在执行操作之前将非整数值四舍五入到最接近的整数。

Examples示例

The following examples use a sales collection with the following documents:以下示例使用带有以下文档的sales集合:

db.sales.insertMany( [
{ _id : 1, "item" : "abc", "price" : 10, "fee" : 2, date: ISODate("2014-03-01T08:00:00Z") },
{ _id : 2, "item" : "jkl", "price" : 20, "fee" : 1, date: ISODate("2014-03-01T09:00:00Z") },
{ _id : 3, "item" : "xyz", "price" : 5, "fee" : 0, date: ISODate("2014-03-15T09:00:00Z") }
] )

Add Numbers添加数字

The following aggregation uses the $add expression in the $project pipeline to calculate the total cost:以下聚合使用$project管道中的$add表达式来计算总成本:

db.sales.aggregate(
[
{ $project: { item: 1, total: { $add: [ "$price", "$fee" ] } } }
]
)

The operation returns the following results:该操作返回以下结果:

{ "_id" : 1, "item" : "abc", "total" : 12 }
{ "_id" : 2, "item" : "jkl", "total" : 21 }
{ "_id" : 3, "item" : "xyz", "total" : 5 }

Perform Addition on a Date在日期上执行添加

The following aggregation uses the $add expression to compute the billing_date by adding 3*24*60*60000 milliseconds (i.e. 3 days) to the date field :以下聚合使用$add表达式通过向date字段添加3*24*60*60000毫秒(即3天)来计算billing_date

db.sales.aggregate(
[
{ $project: { item: 1, billing_date: { $add: [ "$date", 3*24*60*60000 ] } } }
]
)

The operation returns the following results:该操作返回以下结果:

{ "_id" : 1, "item" : "abc", "billing_date" : ISODate("2014-03-04T08:00:00Z") }
{ "_id" : 2, "item" : "jkl", "billing_date" : ISODate("2014-03-04T09:00:00Z") }
{ "_id" : 3, "item" : "xyz", "billing_date" : ISODate("2014-03-18T09:00:00Z") }