MongoDB Extended JSON (v1)

On this page

JSONcan only represent a subset of the types supported byBSON. To preserve type information, MongoDB adds the following extensions to the JSON format:

  • Strict mode

    . Strict mode representations of BSON types conform to the

    JSON RFC

    . Any JSON parser can parse these strict mode representations as key/value pairs; however, only the MongoDB internal JSON parser recognizes the type information conveyed by the format.

  • mongo

    Shell mode

    . The MongoDB internal JSON parser and the

    mongo

    shell can parse this mode.

The representation used for the various data types depends on the context in which the JSON is parsed.

Parsers and Supported Format

Input in Strict Mode

The following can parse representations in strict mode_with_recognition of the type information.

Other JSON parsers, includingmongoshell anddb.eval(), can parse strict mode representations as key/value pairs, but_without_recognition of the type information.

Input inmongoShell Mode

The following can parse representations inmongoshell mode_with_recognition of the type information.

Output in Strict mode

mongoexportandREST and HTTP Interfacesoutput data in_Strict mode_.

Output inmongoShell Mode

bsondumpoutputs inmongoShell mode.

BSON Data Types and Associated Representations

The following presents the BSON data types and the associated representations in_Strict mode_andmongo_Shell mode_.

Binary

data_binary

  • <bindata>is the base64 representation of a binary string.

  • <t>is a representation of a single byte indicating the data type. In

    Strict 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

data_date

In_Strict mode_,<date>is an ISO-8601 date format with a mandatory time zone field following the templateYYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>.

The MongoDB JSON parser currently does not support loading ISO-8601 strings representing dates prior to theUnix epoch. When formatting pre-epoch dates and dates past what your system’stime_ttype can hold, the following format is used:

{ "$date" : { "$numberLong" : "
<
dateAsMilliseconds
>
" } }

In_Shell mode_,<date>is the JSON representation of a 64-bit signed integer giving the number of milliseconds since epoch UTC.

Timestamp

data_timestamp

  • <

    t

    >

    is the JSON representation of a 32-bit unsigned integer for seconds since epoch.

  • <

    i

    >

    is a 32-bit unsigned integer for the increment.

Regular Expression

data_regex

  • <

    sRegex

    >

    is a string of valid JSON characters.

  • <

    jRegex

    >

    is a string that may contain valid JSON characters and unescaped double quote (

    "

    ) characters, but may not contain unescaped forward slash (

    /

    ) characters.

  • <

    sOptions

    >

    is a string containing the regex options represented by 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 the

    JavaScript

    and

    mongo

    Shell

    representations support a limited range of options, any nonconforming options will be dropped when converting to this representation.

OID

data_oid

<id>is a 24-character hexadecimal string.

DB Reference

data_ref

  • <

    name

    >

    is a string of valid JSON characters.

  • <

    id

    >

    is any valid extended JSON type.

Undefined Type

data_undefined

The representation for the JavaScript/BSON undefined type.

You_cannot_useundefinedin query documents. Consider the following document inserted into thepeoplecollection:

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, as in:

db.people.find( { age : { $type : 6 } } )

This query returns all documents for which theagefield has valueundefined.

MinKey

data_minkey

The representation of the MinKey BSON data type that compares lower than all other types. SeeComparison/Sort Orderfor more information on comparison order for BSON types.

MaxKey

data_maxkey

The representation of the MaxKey BSON data type that compares higher than all other types. SeeComparison/Sort Orderfor more information on comparison order for BSON types.

NumberLong

New in version 2.6.

data_numberlong

NumberLongis a 64 bit signed integer. You must include quotation marks or it will be interpreted as a floating point number, resulting in a loss of accuracy.

For example, the following commands insert9223372036854775807as aNumberLongwith 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 oflongUnQuotedhas changed, whilelongQuotedretains its accuracy:

db.json.find()
{ "_id" : ObjectId("54ee1f2d33335326d70987df"), "longQuoted" : NumberLong("9223372036854775807") }
{ "_id" : ObjectId("54ee1f7433335326d70987e0"), "longUnQuoted" : NumberLong("-9223372036854775808") }

NumberDecimal

New in version 3.4.

data_numberdecimal

NumberDecimalis ahigh-precision decimal. You must include quotation marks, or the input number will be treated as a double, resulting in data loss.

For example, the following commands insert123.40as aNumberDecimalwith 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 ofdecimalUnQuotedhas changed, whiledecimalQuotedretains its specified precision:

db.json.find()
{ "_id" : ObjectId("596f88b7b613bb04f80a1ea9"), "decimalQuoted" : NumberDecimal("123.40") }
{ "_id" : ObjectId("596f88c9b613bb04f80a1eaa"), "decimalUnQuoted" : NumberDecimal("123.400000000000") }

最后更新于