On this page
MongoDB 扩展 JSON
在本页面
JSON只能代表BSON支持的类型的子集。为了保留类型信息,MongoDB 将以下扩展添加到 JSON 格式:
严格模式。 BSON 类型的严格模式表示符合JSON RFC。任何 JSON 解析器都可以将这些严格的模式表示形式解析为键/值对。但是,只有 MongoDB 内部 JSON 解析器才能识别格式传达的类型信息。
mongo
壳模式。 MongoDB 内部 JSON 解析器和mongo shell 可以解析此模式。
用于各种数据类型的表示形式取决于解析 JSON 的上下文。
解析器和支持的格式
严格模式下的 Importing
下面可以在识别出类型信息的情况下以严格模式解析表示形式。
各种 MongoDB 工具的
--query
选项
其他 JSON 解析器(包括mongo shell 和db.eval())可以将严格的模式表示形式解析为键/值对,但是不会识别类型信息。
在 mongo Shell 模式下 Importing
下面的代码可以识别类型信息,从而以mongo
shell 模式解析表示形式。
各种 MongoDB 工具的
--query
选项mongo shell
严格模式下的输出
mongoexport以“严格模式”输出数据。
在 mongo Shell 模式下输出
bsondump以mongo
* Shell 模式*输出。
BSON 数据类型和关联的表示形式
下面介绍了* Strict 模式和mongo
* Shell 模式下的 BSON 数据类型和相关表示。
Binary
data_binary
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$binary": "<bindata>", "$type": "<t>" } |
BinData ( <t>, <bindata> ) |
<bindata>
是二进制字符串的 base64 表示形式。<t>
是表示数据类型的单个字节的表示。在“严格模式”下,它是一个十六进制字符串,在“Shell 模式”下,它是一个整数。请参阅扩展的 bson 文档。 http://bsonspec.org/spec.html
Date
data_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
data_timestamp
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$timestamp": { "t": <t>, "i": <i> } } |
Timestamp( <t>, <i> ) |
<t>
是自纪元以来持续秒数的 32 位无符号整数的 JSON 表示形式。<i>
是递增的 32 位无符号整数。
Regular Expression
data_regex
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$regex": "<sRegex>", "$options": "<sOptions>" } |
/<jRegex>/<jOptions> |
<sRegex>
是有效的 JSON 字符的字符串。<jRegex>
是一个字符串,可能包含有效的 JSON 字符和未转义的双引号("
)字符,但可能不包含未转义的正斜杠(/
)字符。<sOptions>
是一个字符串,其中包含由字母表示的正则表达式选项。<jOptions>
是只能包含字符“ g”,“ i”,“ m”和“ s”(在 v1.9 中添加)的字符串。由于JavaScript
和mongo Shell
表示形式支持有限的选项范围,因此在转换为该表示形式时,将删除所有不合格的选项。
OID
data_oid
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$oid": "<id>" } |
ObjectId( "<id>" ) |
<id>
是 24 个字符的十六进制字符串。
DB Reference
data_ref
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$ref": "<name>", "$id": "<id>" } |
DBRef("<name>", "<id>") |
<name>
是有效的 JSON 字符的字符串。<id>
是任何有效的扩展 JSON 类型。
Undefined Type
data_undefined
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
data_minkey
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$minKey": 1 } |
MinKey |
MinKey BSON 数据类型的表示形式,其比较值比所有其他类型都低。有关 BSON 类型的比较 Sequences 的更多信息,请参见Comparison/Sort Order。
MaxKey
data_maxkey
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$maxKey": 1 } |
MaxKey |
MaxKey BSON 数据类型的表示形式,比所有其他类型的比较类型更高。有关 BSON 类型的比较 Sequences 的更多信息,请参见Comparison/Sort Order。
NumberLong
2.6 版的新功能。
data_numberlong
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 版的新功能。
data_numberdecimal
Strict Mode | mongo Shell 模式 | |
---|---|---|
{ "$numberDecimal": "<number>" } |
NumberDecimal( "<number>" ) |
NumberDecimal
是high-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") }