$subtract is a MongoDB aggregation expression that returns expression1 minus expression2. Use it for numbers, for the millisecond difference between two dates, or to subtract milliseconds from a date.
Remember
$subtract = a − b for aggregation
{ $subtract: [ <expression1>, <expression2> ] }
10 − 3 → 7
date − date → milliseconds
date − number → earlier date (number = ms)
null / missing operand → null
exactly two arguments (not a list of many)
For a total like price + fee − discount, nest $add inside $subtract.
For dates: date − date → ms; date − ms → date (date must be first).
Piece
Required?
Role
Expression 1
Yes
Minuend (starting value / date)
Expression 2
Yes
Subtrahend (amount or date to remove)
$ifNull
No
Default missing numbers to 0
Pseudocode
Pseudocode
for each document:
a = evaluate(expression1)
b = evaluate(expression2)
if a is null or b is null:
result = null
else:
result = a − b // numbers, dates, or date − ms
emit { ..., field: result }
Reference
Cheat Sheet
Keep these facts handy while writing subtraction expressions.
We store one sale with price, fee, and discount. First we subtract the discount from price, then we nest $add for a full total. Run these in mongosh after inserting the sample data once.
Example 1 — Sample Data
Imagine one sale for item abc with price 10, fee 2, and discount 5. We save it in a collection named sales.
Check these before using $subtract in production pipelines.
order
First minus second
$subtract([a, b]) is a − b, not b − a. Swap arguments and the sign flips.
null
Null operands become null
If either side is null or missing, the result is null. Use $ifNull when you want 0.
dates
Date − number needs date first
To subtract milliseconds from a date, put the date in argument 1. Two dates return milliseconds, not calendar days—use $dateDiff for day/month units.
arity
Exactly two arguments
Unlike $add, you cannot pass a long list. Nest expressions or subtract step by step.
Analysis
Performance Notes
Approach
Cost
Best for
$subtract alone
Per-document arithmetic
Simple field differences
$add + $subtract
Still O(docs)
Totals with fees and discounts
Date − date
Per-document ms difference
Age / duration in milliseconds
Arithmetic is cheap compared with large sorts or joins. Filter early with $match when only some documents need a computed total.
Remember
Key Takeaways
Role: first − second (numbers or dates).
Arity: exactly two arguments.
Totals: nest $add inside $subtract.
Dates: date − date → ms; date − ms → date.
One line:$subtract answers “what is the first value minus the second?”—for numbers, or for dates in milliseconds.
Frequently Asked Questions
$subtract returns the difference of two expressions: the first minus the second. For numbers, { $subtract: [ 10, 3 ] } returns 7. Use it inside aggregation expression stages such as $project and $addFields.
Use { $subtract: [ <expression1>, <expression2> ] }. The result is expression1 − expression2. Both can be field references, literals, or nested expressions.
Yes. Two dates → difference in milliseconds. A date minus a number (milliseconds) → a new date. To subtract a number from a date, the date must be the first argument.
$subtract takes exactly two operands (a − b). $add can sum multiple values. To subtract several numbers, nest $subtract or add negative values with $add.
If either operand is null or missing, $subtract returns null. Use $ifNull when missing values should be treated as zero.
Yes for numbers. Think of $subtract as MongoDB’s aggregation version of a - b—run it in the pipeline, not as a standalone find() filter.