MongoDB 扩展 JSON

在本页面

JSON只能代表BSON支持的类型的子集。为了保留类型信息,MongoDB 将以下扩展添加到 JSON 格式:

用于各种数据类型的表示形式取决于解析 JSON 的上下文。

解析器和支持的格式

严格模式下的 Importing

下面可以在识别出类型信息的情况下以严格模式解析表示形式。

其他 JSON 解析器(包括mongo shell 和db.eval())可以将严格的模式表示形式解析为键/值对,但是不会识别类型信息。

在 mongo Shell 模式下 Importing

下面的代码可以识别类型信息,从而以mongo shell 模式解析表示形式。

严格模式下的输出

mongoexport以“严格模式”输出数据。

在 mongo Shell 模式下输出

bsondumpmongo * Shell 模式*输出。

BSON 数据类型和关联的表示形式

下面介绍了* Strict 模式mongo * Shell 模式下的 BSON 数据类型和相关表示。

Binary

Strict Mode mongo Shell 模式
{ "$binary": "<bindata>", "$type": "<t>" } BinData ( <t>, <bindata> )

Date

Strict Mode mongo Shell 模式
{ "$date": "<date>" } new Date ( <date> )

在“严格模式”下,<date>是 ISO-8601 日期格式,模板YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>之后是必填的时区字段。

在* Shell 模式*中,<date>是一个 64 位有符号整数的 JSON 表示形式,给出自历元 UTC 以来的毫秒数。

Timestamp

Strict Mode mongo Shell 模式
{ "$timestamp": { "t": <t>, "i": <i> } } Timestamp( <t>, <i> )

Regular Expression

Strict Mode mongo Shell 模式
{ "$regex": "<sRegex>", "$options": "<sOptions>" } /<jRegex>/<jOptions>

OID

Strict Mode mongo Shell 模式
{ "$oid": "<id>" } ObjectId( "<id>" )

<id>是 24 个字符的十六进制字符串。

DB Reference

Strict Mode mongo Shell 模式
{ "$ref": "<name>", "$id": "<id>" } DBRef("<name>", "<id>")

Undefined Type

Strict Mode mongo Shell 模式
{ "$undefined": true } undefined

JavaScript/BSON 未定义类型的表示形式。

不能在查询文档中使用undefined。考虑将以下文档插入people集合:

db.people.insert( { name : "Sally", age : undefined } )

以下查询返回错误:

db.people.find( { age : undefined } )
db.people.find( { age : { $gte : undefined } } )

但是,您可以使用$type查询未定义的值,如下所示:

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

该查询返回age字段的值为undefined的所有文档。

MinKey

Strict Mode mongo Shell 模式
{ "$minKey": 1 } MinKey

MinKey BSON 数据类型的表示形式,其比较值比所有其他类型都低。有关 BSON 类型的比较 Sequences 的更多信息,请参见Comparison/Sort Order

MaxKey

Strict Mode mongo Shell 模式
{ "$maxKey": 1 } MaxKey

MaxKey BSON 数据类型的表示形式,比所有其他类型的比较类型更高。有关 BSON 类型的比较 Sequences 的更多信息,请参见Comparison/Sort Order

NumberLong

2.6 版的新功能。

Strict Mode mongo Shell 模式
{ "$numberLong": "<number>" } NumberLong( "<number>" )

NumberLong是 64 位有符号整数。您必须包括引号,否则它将被解释为浮点数,从而导致准确性下降。

例如,以下命令将9223372036854775807插入为NumberLong,并在整数值前后加上或不带引号:

db.json.insert( { longQuoted : NumberLong("9223372036854775807") } )
db.json.insert( { longUnQuoted : NumberLong(9223372036854775807) } )

检索文档时,longUnQuoted的值已更改,而longQuoted保留了其准确性:

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

NumberDecimal

3.4 版的新功能。

Strict Mode mongo Shell 模式
{ "$numberDecimal": "<number>" } NumberDecimal( "<number>" )

NumberDecimalhigh-precision decimal。您必须添加引号,否则 Importing 数字将被视为双精度数字,从而导致数据丢失。

例如,以下命令将123.40插入为NumberDecimal,并在该值前后加上或不带引号:

db.json.insert( { decimalQuoted : NumberDecimal("123.40") } )
db.json.insert( { decimalUnQuoted : NumberDecimal(123.40) } )

检索文档时,decimalUnQuoted的值已更改,而decimalQuoted保留其指定的精度:

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