$subtract (집계)
정의
$subtract
두 숫자를 빼서 차이를 반환하거나, 두 날짜를 빼서 밀리초 단위의 차이를 반환하거나, 날짜와 밀리초 단위의 숫자를 빼서 결과 날짜를 반환합니다.
$subtract
표현식의 구문은 다음과 같습니다.{ $subtract: [ <expression1>, <expression2> ] } 두 번째 인수는 첫 번째 인수에서 뺍니다.
인수는 숫자 및/또는 날짜로 해석되는 한 유효한 표현식 이 될 수 있습니다. 날짜에서 숫자를 빼려면 날짜가 첫 번째 인수여야 합니다. 표현식에 대한 자세한 내용은 표현식 연산자를 참조하세요.
행동
입력 타입이 혼합될 때 $subtract
은 더 작은 입력 타입을 두 타입 중 더 큰 타입으로 승격합니다. 타입은 더 넓은 범위의 값을 표현할 수 있을 때 더 큰 것으로 간주됩니다. 숫자 타입은 작은 것부터 큰 것 순으로 integer → long → double → decimal입니다.
또한 더 큰 입력 유형은 결과 유형도 결정합니다. 단, 연산 오버플로가 발생하여 더 큰 데이터 유형이 나타내는 범위를 벗어나지 않아야 합니다. 오버플로의 경우 $subtract
은 다음 순서에 따라 결과를 승격합니다.
Date
와 정수가 아닌 피연산자를 혼합할 경우 $subtract
는 연산을 수행하기 전에 정수가 아닌 값을 가장 가까운 정수로 반올림합니다.
예시
다음 문서가 포함된 sales
collection을 생각해 보세요.
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
표현식을 통해 시스템 NOW
를 사용하여 현재 날짜에서 $date
를 빼고 그 차이를 밀리초 단위로 반환합니다.
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") }