In MongoDB, the $toDate aggregation operator converts a value to a date
$toDate takes any valid expression. If the expression can’t be converted to a date, it returns an error. If the expression is null or missing, it returns null.
Example
Suppose we have a collection called samples with the following document:
{
"_id" : ObjectId("60066f1cc8eb4369cf6ad9c9"),
"double" : 1613372035500.75,
"decimal" : NumberDecimal("1613372035500.75"),
"long" : NumberLong("1613372035500"),
"string" : "2021-02-15 06:53:55"
}
We can use the following query to return each of those values as a Date.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
"ObjectId": { $toDate: "$_id" },
"double": { $toDate: "$double" },
"decimal": { $toDate: "$decimal" },
"long": { $toDate: "$long" },
"string": { $toDate: "$string" }
}
}
]
).pretty()
Result:
{
"ObjectId" : ISODate("2021-01-19T05:33:16Z"),
"double" : ISODate("2021-02-15T06:53:55.500Z"),
"decimal" : ISODate("2021-02-15T06:53:55.500Z"),
"long" : ISODate("2021-02-15T06:53:55.500Z"),
"string" : ISODate("2021-02-15T06:53:55Z")
}
As expected, all fields are returned with their corresponding values converted to Date values.
You may notice that the ObjectId field returns a different date to the others. This is because the _id field’s value reflects the date that the document was created, whereas the other dates were just arbitrary dates created by me. More about the ObjectId below.
Input Types
The $toDate operator accepts the following input types:
- Double
- Decimal
- Long
- String (must be a valid date string)
- ObjectId
More about these below.
Numeric Types
When using the numeric types (Double, Decimal, and Long), $toDate returns a date that corresponds to the number of milliseconds represented by the value. For Double and Decimal, this is the truncated value. The $toDate operator interprets numeric values as follows:
- A positive value corresponds to the number of milliseconds since Jan 1, 1970.
- A negative value corresponds to the number of milliseconds before Jan 1, 1970.
String Types
When using a string type, the string must be a valid date string. For example:
"2021-02-15""15 February 2021""2021-02-15 06:53:55""2021-02-15 06:53:55+1100"
You can’t use incomplete dates or invalid values such as "Monday", "March", "2020", etc.
ObjectId
ObjectId values are 12 byte hexadecimal values that consist of:
- A 4 byte timestamp value, representing the ObjectId’s creation, measured in seconds since the Unix epoch.
- A 5 byte is a random value
- A 3 byte incrementing counter, initialised to a random value.
The $toDate operator returns the timestamp portion as a Date.