文档菜单
文档首页
/
MongoDB 手册
/ / /

$subtract (聚合)

在本页

  • 定义
  • 行为
  • 示例
$subtract

减去两个数字以返回差值,或两个日期以返回毫秒数的差值,或日期和毫秒数以返回结果日期。

下面是$subtract 表达式的语法

{ $subtract: [ <expression1>, <expression2> ] }

第二个参数从第一个参数中减去。

参数可以是任何有效的表达式,只要它们解析为数字和/或日期。要从日期中减去一个数字,日期必须是第一个参数。有关表达式的更多信息,请参阅表达式运算符

当输入类型混合时,$subtract 会将较小的输入类型提升为较大的类型。当类型表示的值范围更广时,它被认为更大。数值类型的顺序从最小到最大为:整数 → 长整数 → 双精度浮点数 → 小数

输入类型的较大者还决定了结果类型,除非操作溢出且超出了较大数据类型所表示的范围。在溢出的情况下,$subtract 会按照以下顺序提升结果类型

  • 如果较大的输入类型是 整数,则结果类型提升为 长整数

  • 如果较大的输入类型是 长整数,则结果类型提升为 双精度浮点数

  • 如果较大的类型是 双精度浮点数小数,则溢出结果表示为 + 或 - 无穷大。结果类型不会有提升。

当混合 日期 和非整数操作数时,$subtract 会在执行操作之前将非整数值四舍五入到最接近的整数。

考虑一个包含以下文档的 sales 集合

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

以下聚合操作使用 $subtract 表达式通过从 pricefee 的小计中减去 discount 来计算 total

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

该操作返回以下结果

{ "_id" : 1, "item" : "abc", "total" : 7 }
{ "_id" : 2, "item" : "jkl", "total" : 19 }

以下聚合使用$subtract表达式从当前日期减去$date,使用系统NOW并返回毫秒数差值

db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [ "$$NOW", "$date" ] } } } ] )

或者,你可以使用Date()获取当前日期:

db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [ new Date(), "$date" ] } } } ] )

这两个操作返回的文档类似于以下内容

{ "_id" : 1, "item" : "abc", "dateDifference" : NumberLong("186136746187") }
{ "_id" : 2, "item" : "jkl", "dateDifference" : NumberLong("186133146187") }

以下聚合使用$subtract表达式从"$date"字段减去5 * 60 * 1000毫秒(5分钟)

db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [ "$date", 5 * 60 * 1000 ] } } } ] )

该操作返回以下结果

{ "_id" : 1, "item" : "abc", "dateDifference" : ISODate("2014-03-01T07:55:00Z") }
{ "_id" : 2, "item" : "jkl", "dateDifference" : ISODate("2014-03-01T08:55:00Z") }

返回

substrCP