$subtract (聚合)
定义
行为
当输入类型混合时,$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
表达式通过从 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
并返回毫秒数差值
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") }