MongoDB Extended JSON (v2)
JSON can only directly represent a subset of the types
supported by BSON. To preserve type information, MongoDB adds
the following extensions to the JSON format.
- Canonical Mode
- A string format that emphasizes type preservation at the expense
of readability and interoperability. That is, conversion from
canonical to BSON will generally preserve type information except
in certain specific cases.
- Relaxed Mode
- A string format that emphasizes readability and interoperability
at the expense of type preservation. That is, conversion from
relaxed format to BSON can lose type information.
Both formats conform to the JSON RFC and can be
parsed by the various MongoDB drivers and tools.
MongoDB Extended JSON v2 Usage
Drivers
The following drivers use the Extended JSON v2.0
For C# and Ruby that use Legacy MongoDB Extended JSON v1, refer to
MongoDB Extended JSON (v1).
BSON Data Types and Associated Representations
The following presents some common BSON data types and the associated
representations in Canonical and Relaxed.
For a complete list, see
https://github.com/mongodb/specifications/blob/master/source/extended-json.rst#conversion-table.
-
Array
Where the array elements are as follows: |
<elements>
- Array elements use Extended JSON.
To specify an empty array, omit the content
[ ] .
|
-
Binary
Where the values are as follows: |
"<payload>"
- Base64 encoded (with padding as “=”) payload string.
"<t>"
- A one- or two-character hex string that corresponds to a
BSON binary subtype. See the extended bson documentation
http://bsonspec.org/spec.html for subtypes available.
|
-
Date
For dates between years 1970 and 9999, inclusive:
For dates before year 1970 or after year 9999:
Where the values are as follows: |
"<millis>"
- A 64-bit signed integer as string. The value
represents milliseconds relative to the epoch.
"<ISO-8601 Date/Time Format>"
- A date in ISO-8601 Internet
Date/Time Format as string.
The date/time has a maximum time precision of milliseconds:
- Fractional seconds have exactly 3 decimal
places if the fractional part is non-zero.
- Otherwise, fractional seconds SHOULD be omitted if zero.
|
-
Decimal128
Where the values are as follows: |
|
-
Document
Where the document contents are as follows: |
<content>
- Name:value pairs that use Extended JSON.
To specify an empty document, omit the content
{ } .
|
-
Double
For finite numbers:
For infinite numbers or NAN:
Where the values are as follows: |
"<decimal string>"
- A 64-bit signed floating point as a string.
<non-integer number>
- A non-integer number. Integer numbers are parsed as
integer instead of double.
|
-
Int64
Where the values are as follows: |
"<number>"
- A 64-bit signed integer as string.
<integer>
- A 64-bit signed integer.
|
-
Int32
Where the values are as follows: |
"<number>"
- A 32-bit signed integer as string.
<integer>
- A 32-bit signed integer.
|
-
MaxKey
The MaxKey BSON data type compares higher than all other types. See
Comparison/Sort Order for more information on
comparison order for BSON types.
-
MinKey
The MinKey BSON data type compares lower than all other types. See
Comparison/Sort Order for more information on
comparison order for BSON types.
-
ObjectId
Where the values are as follows: |
"<ObjectId bytes>"
- A 24-character, big-endian hexadecimal string that
represents the ObjectId bytes.
|
-
Regular Expression
Where the values are as follows: |
"<regexPattern>"
A string that corresponds to the regular expression
pattern. The string can contain valid JSON characters and
unescaped double quote (" ) characters, but may not
contain unescaped forward slash (/ ) characters.
"<options>"
A string that specifies BSON regular expression options
(‘g’, ‘i’, ‘m’ and ‘s’) or an empty string "" .
Options other than (‘g’, ‘i’, ‘m’ and ‘s’) will be dropped
when converting to this representation.
Important
The options MUST be in alphabetical order.
|
-
Timestamp
Where the values are as follows: |
<t>
- A positive integer for the seconds since epoch.
<i>
- A positive integer for the increment.
|
Example
Example Field Name |
Canonical Format |
Relaxed Format |
“_id:” |
{“$oid”:”5d505646cf6d4fe581014ab2”} |
{“$oid”:”5d505646cf6d4fe581014ab2”} |
“arrayField”: |
[“hello”,{“$numberInt”:”10”}] |
[“hello”,10] |
“dateField”: |
{“$date”:{“$numberLong”:”1565546054692”}} |
{“$date”:”2019-08-11T17:54:14.692Z”} |
“dateBefore1970”: |
{“$date”:{“$numberLong”:”-1577923200000”}} |
{“$date”:{“$numberLong”:”-1577923200000”}} |
“decimal128Field”: |
{“$numberDecimal”:”10.99”} |
{“$numberDecimal”:”10.99”} |
“documentField”: |
{“a”:”hello”} |
{“a”:”hello”} |
“doubleField”: |
{“$numberDouble”:”10.5”} |
10.5 |
“infiniteNumber” |
{“$numberDouble”:”Infinity”} |
{“$numberDouble”:”Infinity”} |
“int32field”: |
{“$numberInt”:”10”} |
10 |
“int64Field”: |
{“$numberLong”:”50”} |
50 |
“minKeyField”: |
{“$minKey”:1} |
{“$minKey”:1} |
“maxKeyField”: |
{“$maxKey”:1} |
{“$maxKey”:1} |
“regexField”: |
{“$regularExpression”:{“pattern”:”^H”,”options”:”i”}} |
{“$regularExpression”:{“pattern”:”^H”,”options”:”i”}} |
“timestampField”: |
{“$timestamp”:{“t”:1565545664,”i”:1}} |
{“$timestamp”:{“t”:1565545664,”i”:1}} |