MongoDB 扩展 JSON (v1)
重要
消除歧义
以下页面讨论了 MongoDB 扩展 JSON v1(旧版扩展 JSON)。有关 MongoDB 扩展 JSON v2 的讨论,请参阅MongoDB 扩展 JSON (v2).
在mongo
中支持的数据类型,请参阅mongosh 数据类型.
JSON只能表示由BSON支持的部分类型。为了保留类型信息,MongoDB在JSON格式中添加了以下扩展
严格模式。BSON类型的严格模式表示符合JSON RFC。任何JSON解析器都可以解析这些严格模式的表示为键值对;然而,只有MongoDB内部的JSON解析器能识别由格式传达的类型信息。
mongo
Shell 模式。MongoDB内部的JSON解析器和mongo
shell可以解析此模式。
用于各种数据类型的表示取决于JSON解析的上下文。
MongoDB 扩展JSON v1 和 MongoDB 驱动
以下驱动程序使用扩展JSON v1.0(旧版)
C#
Ruby
对于其他驱动程序,请参阅 MongoDB 扩展 JSON (v2)。
解析器和支持的格式
严格模式下的输入
以下可以解析严格模式下的表示,并且识别类型信息。
mongoimport
版本 4.0 及更早版本各种 MongoDB 工具的
--query
选项
其他 JSON 解析器,包括 mongo
命令行,可以将严格模式下的表示解析为键值对,但 无法 识别类型信息。
mongo
命令行模式下的输入
以下可以解析 mongo
命令行模式下的表示,并且识别类型信息。
mongoimport
版本 4.0 及更早版本各种 MongoDB 工具的
--query
选项mongo
命令行
严格模式下的输出
在版本4.2之前,mongoexport
以MongoDB扩展JSON v1的严格模式输出数据。
在mongo
Shell模式下的输出
在版本4.2之前,bsondump
以mongo
的Shell模式输出。
BSON数据类型及其相关表示
以下展示了在严格模式和mongo
Shell模式下的BSON数据类型及其相关表示。
二进制
data_binary
- 严格模式
mongo
Shell 模式{ "$binary": "<bindata>", "$type": "<t>" } BinData ( <t>, <bindata> )
值如下
<bindata>
是二进制字符串的base64表示。<t>
是表示单个字节的类型表示。在严格模式中它是一个十六进制字符串,在Shell模式中它是一个整数。参见扩展的bson文档。[http://bsonspec.org/spec.html](http://bsonspec.org/spec.html)http://bsonspec.org/spec.html
日期
data_date
- 严格模式
mongo
Shell 模式{ "$date": "<date>" } new Date ( <date> ) 在 严格模式 下,
<date>
是 ISO-8601 日期格式,包含必须的时间区域字段,格式为YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>
。在 Shell 模式 下,
<date>
是自纪元 UTC 以来以毫秒表示的 64 位有符号整数的 JSON 表示形式。
时间戳
data_timestamp
- 严格模式
mongo
Shell 模式{ "$timestamp": { "t": <t>, "i": <i> } } Timestamp( <t>, <i> )
值如下
<t>
是自纪元以来以秒表示的 32 位无符号整数的 JSON 表示形式。<i>
是用于递增的32位无符号整数。
正则表达式
data_regex
- 严格模式
mongo
Shell 模式{ "$regex": "<sRegex>", "$options": "<sOptions>" } /<jRegex>/<jOptions>
值如下
<sRegex>
是有效的JSON字符的字符串。<jRegex>
是可能包含有效的JSON字符和未转义的引号 ("
) 字符的字符串,但不能包含未转义的斜杠 (/
) 字符。<sOptions>
是包含由字母表示的regex选项的字符串。<jOptions>
是可能仅包含字符 'g', 'i', 'm' 和 's' (自v1.9添加) 的字符串。因为JavaScript和mongo Shell的表示支持有限的范围选项,任何非符合选项在转换到此表示时将被丢弃。
OID
data_oid
- 严格模式
mongo
Shell 模式{ "$oid": "<id>" } ObjectId( "<id>" )
值如下
<id>
是一个24位的十六进制字符串。
数据库引用
data_ref
- 严格模式
mongo
Shell 模式{ "$ref": "<name>", "$id": "<id>" } DBRef("<name>", "<id>")
值如下
<name>
是一个有效的JSON字符字符串。<id>
是任何有效的扩展JSON类型。
未定义类型
data_undefined
- 严格模式
mongo
Shell 模式{ "$undefined": true } undefined JavaScript/BSON 未定义类型的表示。
您不能在查询文档中使用
undefined
。考虑以下文档,使用旧版mongo
shell 将其插入people
集合:db.people.insertOne( { name : "Sally", age : undefined } ) 以下查询返回错误
db.people.find( { age : undefined } ) db.people.find( { age : { $gte : undefined } } ) 但是,您可以使用
$type
查询未定义值,例如:db.people.find( { age : { $type : 6 } } ) 此查询返回所有年龄字段值为
undefined
的文档。
MinKey
MaxKey
NumberLong
data_numberlong
- 严格模式
mongo
Shell 模式{ "$numberLong": "<number>" } NumberLong( "<number>" ) NumberLong
是一个 64 位有符号整数。在传统的mongo
命令行界面中,你必须使用引号来插入NumberLong
,否则将产生错误。例如,以下命令尝试将
9223372036854775807
作为NumberLong
插入,并分别使用和未使用整数值周围的引号db.json.insertOne( { longQuoted : NumberLong("9223372036854775807") } ) db.json.insertOne( { longUnQuoted : NumberLong(9223372036854775807) } )
NumberDecimal
data_numberdecimal
- 严格模式
mongo
Shell 模式{ "$numberDecimal": "<number>" } NumberDecimal( "<number>" ) NumberDecimal
是一种 高精度十进制数。您必须包含引号,否则输入的数字将被视为双精度浮点数,从而导致数据丢失。例如,以下命令分别插入带有和没有引号的
123.40
作为NumberDecimal
db.json.insertOne( { decimalQuoted : NumberDecimal("123.40") } ) db.json.insertOne( { decimalUnQuoted : NumberDecimal(123.40) } ) 当检索文档时,
decimalUnQuoted
的值已更改,而decimalQuoted
保留了其指定的精度db.json.find() { "_id" : ObjectId("596f88b7b613bb04f80a1ea9"), "decimalQuoted" : NumberDecimal("123.40") } { "_id" : ObjectId("596f88c9b613bb04f80a1eaa"), "decimalUnQuoted" : NumberDecimal("123.400000000000") } 重要
在
mongosh
. 中的插入行为与此不同已弃用的引号字符串格式
NumberDecimal("123.40")
。插入成功,但也会产生警告未引号字符串格式
NumberDecimal(123.40)
将值存储为123.4
。尾部的0
被删除