MongoDB聚合运算符:$subtract

MongoDB聚合运算符:$subtract


$subtract聚合运算符返回两个数值的差值,或者返回两个日期相差的毫秒数,或者日期与一个毫秒数相差的日期。

语法

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

运算时用第一个参数中减去第二个参数,参数可以是任何可解析为数值或日期的表达式。从日期减去一个数值时,日期必须是第一个参数。

使用

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

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

举例

使用下面的脚本创建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(从 4.2 开始可用):

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分钟的毫秒数5*60*1000

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") }
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

原子星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值