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
运算符计算从price
和fee
小计中减去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") }