MongoDB Extended JSON (v1)
Disambiguation
The following page discusses MongoDB Extended JSON v1 (Legacyextended JSON). For discussion on MongoDB Extended JSON v2, seeMongoDB Extended JSON (v2).
For mongo
shell wrapper methods for types, seeData Types in the mongo Shell.
JSON can only represent a subset of the types supported byBSON. To preserve type information, MongoDB adds the followingextensions to the JSON format:
- Strict mode. Strict mode representations of BSON types conform tothe JSON RFC. Any JSON parser can parsethese strict mode representations as key/value pairs; however, onlythe MongoDB internal JSON parser recognizes the typeinformation conveyed by the format.
mongo
Shell mode. The MongoDB internal JSON parser and themongo
shell can parse this mode.
The representation used for the various data types depends on thecontext in which the JSON is parsed.
MongoDB Extended JSON v1 and MongoDB Drivers
The following drivers use the Extended JSON v1.0 (Legacy)
- C#
- Ruby
For the other drivers, refer to MongoDB Extended JSON (v2).
Parsers and Supported Format
Input in Strict Mode
The following can parse representations in strict mode _with_recognition of the type information.
mongoimport
version 4.0 and earlier—query
option of various MongoDB tools- MongoDB Compass
Other JSON parsers, including mongo
shell, can parsestrict mode representations as key/value pairs, but _without_recognition of the type information.
Input in mongo Shell Mode
The following can parse representations in mongo
shell mode _with_recognition of the type information.
mongoimport
version 4.0 and earlier—query
option of various MongoDB toolsmongo
shell
Output in Strict mode
Before version 4.2, mongoexport
and REST andHTTP Interfaces output data in _Strict mode_of MongoDB Extended JSON v1.
Output in mongo Shell Mode
Before version 4.2, bsondump
outputs in mongo
Shellmode.
BSON Data Types and Associated Representations
The following presents the BSON data types and the associatedrepresentations in Strict mode and mongo
Shell mode.
Binary
Strict Mode mongo
Shell Mode
- { "$binary": "<bindata>", "$type": "<t>" }
- BinData ( <t>, <bindata> )
<bindata>
is the base64 representation of a binary string.<t>
is a representation of a single byte indicating the data type. InStrict mode it is a hexadecimal string, and in Shell mode it is an integer.See the extended bson documentation. http://bsonspec.org/spec.html
Date
Strict Mode mongo
Shell Mode
- { "$date": "<date>" }
- new Date ( <date> )
In Strict mode, <date>
is an ISO-8601 date format with a mandatory timezone field following the template YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>
.
In Shell mode, <date>
is the JSON representation of a 64-bit signedinteger giving the number of milliseconds since epoch UTC.
Timestamp
Strict Mode mongo
Shell Mode
- { "$timestamp": { "t": <t>, "i": <i> } }
- Timestamp( <t>, <i> )
<t>
is the JSON representation of a 32-bit unsigned integer forseconds since epoch.<i>
is a 32-bit unsigned integer for the increment.
Regular Expression
Strict Mode mongo
Shell Mode
- { "$regex": "<sRegex>", "$options": "<sOptions>" }
- /<jRegex>/<jOptions>
<sRegex>
is a string of valid JSON characters.<jRegex>
is a string that may contain valid JSON characters andunescaped double quote ("
) characters, but may not containunescaped forward slash (/
) characters.<sOptions>
is a string containing the regex options representedby the letters of the alphabet.<jOptions>
is a string that may contain only the characters ‘g’,‘i’, ‘m’ and ‘s’ (added in v1.9). Because theJavaScript
andmongo Shell
representations support a limited range of options,any nonconforming options will be dropped when converting to thisrepresentation.
OID
Strict Mode mongo
Shell Mode
- { "$oid": "<id>" }
- ObjectId( "<id>" )
<id>
is a 24-character hexadecimal string.
DB Reference
Strict Mode mongo
Shell Mode
- { "$ref": "<name>", "$id": "<id>" }
- DBRef("<name>", "<id>")
<name>
is a string of valid JSON characters.<id>
is any valid extended JSON type.
Undefined Type
Strict Mode mongo
Shell Mode
- { "$undefined": true }
- undefined
The representation for the JavaScript/BSON undefined type.
You cannot use undefined
in query documents.Consider the following document inserted into the people
collection:
- db.people.insert( { name : "Sally", age : undefined } )
The following queries return an error:
- db.people.find( { age : undefined } )
- db.people.find( { age : { $gte : undefined } } )
However, you can query for undefined values using $type
, asin:
- db.people.find( { age : { $type : 6 } } )
This query returns all documents for which the age
field hasvalue undefined
.
MinKey
Strict Mode mongo
Shell Mode
- { "$minKey": 1 }
- MinKey
The representation of the MinKey BSON data type that compares lowerthan all other types. SeeComparison/Sort Order for more information oncomparison order for BSON types.
MaxKey
Strict Mode mongo
Shell Mode
- { "$maxKey": 1 }
- MaxKey
The representation of the MaxKey BSON data type that compares higherthan all other types. SeeComparison/Sort Order for more information oncomparison order for BSON types.
NumberLong
New in version 2.6.
Strict Mode mongo
Shell Mode
- { "$numberLong": "<number>" }
- NumberLong( "<number>" )
NumberLong
is a 64 bit signed integer. You must include quotationmarks or it will be interpreted as a floating point number, resultingin a loss of accuracy.
For example, the following commands insert 9223372036854775807
as aNumberLong
with and without quotation marks around the integer value:
- db.json.insert( { longQuoted : NumberLong("9223372036854775807") } )
- db.json.insert( { longUnQuoted : NumberLong(9223372036854775807) } )
When you retrieve the documents, the value of longUnQuoted
haschanged, while longQuoted
retains its accuracy:
- db.json.find()
- { "_id" : ObjectId("54ee1f2d33335326d70987df"), "longQuoted" : NumberLong("9223372036854775807") }
- { "_id" : ObjectId("54ee1f7433335326d70987e0"), "longUnQuoted" : NumberLong("-9223372036854775808") }
NumberDecimal
New in version 3.4.
Strict Mode mongo
Shell Mode
- { "$numberDecimal": "<number>" }
- NumberDecimal( "<number>" )
NumberDecimal
is a high-precision decimal. You must include quotation marks, or theinput number will be treated as a double, resulting in data loss.
For example, the following commands insert 123.40
as aNumberDecimal
with and without quotation marks around the value:
- db.json.insert( { decimalQuoted : NumberDecimal("123.40") } )
- db.json.insert( { decimalUnQuoted : NumberDecimal(123.40) } )
When you retrieve the documents, the value of decimalUnQuoted
haschanged, while decimalQuoted
retains its specified precision:
- db.json.find()
- { "_id" : ObjectId("596f88b7b613bb04f80a1ea9"), "decimalQuoted" : NumberDecimal("123.40") }
- { "_id" : ObjectId("596f88c9b613bb04f80a1eaa"), "decimalUnQuoted" : NumberDecimal("123.400000000000") }