MongoDB 扩展 JSON (v1)
重要
消歧
以下页面将讨论MongoDB扩展JSON v 1 (传统扩展JSON)。 有关MongoDB扩展JSON v 2的讨论,请参阅 MongoDB扩展JSON (v 2 )。
有关 mongo
支持的数据类型,请参阅 mongosh 数据类型。
JSON只能表示BSON支持的类型的子集。 为了保留类型信息,MongoDB 在 JSON 格式中添加了以下扩展:
严格模式。 BSON types的严格模式表示符合JSON RFC 。任何 JSON 解析器都可以将这些严格模式表示解析为键/值对;但是,只有 MongoDB 内部 JSON 解析器可以识别该格式传达的类型信息。
mongo
Shell 模式。 MongoDB 内部 JSON 解析器和mongo
Shell 可以解析此模式。
各种数据类型使用的表示形式取决于解析 JSON 的上下文。
MongoDB 扩展 JSON v 1和 MongoDB 驱动程序
以下驱动程序使用扩展 JSON v 1.0 (旧版)
C#
Ruby
有关其他驱动程序,请参阅MongoDB Extended JSON (v 2 )。
解析器和支持的格式
严格模式下的输入
以下可以通过识别类型信息来解析严格模式下的表示。
mongoimport
版本4.0及更早版本--query
各种 MongoDB 工具的选项
其他JSON解析器(包括mongo
shell )可以将严格模式表示解析为键/值对,但无法识别类型信息。
以mongo
Shell 模式输入
以下代码可以通过识别类型信息来解析mongo
shell 模式下的表示。
mongoimport
版本4.0及更早版本--query
各种 MongoDB 工具的选项mongo
Shell
以严格模式输出
在4.2版本之前, mongoexport
以 MongoDB 扩展 JSON v 1的严格模式输出数据。
Shell 模式下的输出mongo
在 4.2 版本之前, bsondump
以 mongo
shell模式输出。
BSON 数据类型和相关表示形式
下面介绍BSON数据类型以及严格模式和 mongo
shell模式下的关联表示形式。
二进制文件
data_binary
- 严格模式
mongo
shell模式{ "$binary": "<bindata>", "$type": "<t>" } BinData ( <t>, <bindata> )
其中的值如下所示:
<bindata>
是二进制string的 base64 表示形式。<t>
是指示数据类型的单个字节的表示形式。 在严格模式下,它是一个十六进制string ;在shell模式下,它是一个整数。 请参阅扩展BSON文档。 http://bsonspec.org/spec.html
Date
data_date
- 严格模式
mongo
shell模式{ "$date": "<date>" } new Date ( <date> ) 在严格模式下,
<date>
是 ISO- 8601日期格式,模板YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>
后面带有必填时区字段。在shell模式下,
<date>
是 64 位带符号整数的JSON表示形式,给出自 UTC 纪元以来的毫秒数。
时间戳
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>
是string有效的JSON字符。<jRegex>
是一个字符串,可以包含有效的 JSON 字符和非转义双引号 ("
) 字符,但不能包含未转义的正斜杠 (/
) 字符。<sOptions>
是一个string ,其中包含由字母表中的字母表示的正则表达式选项。<jOptions>
是一个字符串,只能包含字符 'g'、'i'、'm' 和 's'(在 v1.9 中添加)。 由于JavaScript
和mongo Shell
表示形式支持有限范围的选项,因此在转换为该表示形式时,所有不合格的选项都将被删除。
oid
data_oid
- 严格模式
mongo
shell模式{ "$oid": "<id>" } ObjectId( "<id>" )
其中的值如下所示:
<id>
是一个包含 24 个字符的十六进制string 。
数据库引用
data_ref
- 严格模式
mongo
shell模式{ "$ref": "<name>", "$id": "<id>" } DBRef("<name>", "<id>")
其中的值如下所示:
<name>
是string有效的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 } } ) 此查询返回
age
字段值为undefined
的所有文档。
最小键值
Max key
NumberLong
data_numberlong
- 严格模式
mongo
shell模式{ "$numberLong": "<number>" } NumberLong( "<number>" ) NumberLong
是一个 64 位有符号整数。 在旧版mongo
shell 中,必须使用引号插入NumberLong
,否则操作将产生错误。例如,以下命令尝试将
9223372036854775807
作为NumberLong
插入,在整数值两边带或不带引号:db.json.insertOne( { longQuoted : NumberLong("9223372036854775807") } ) db.json.insertOne( { longUnQuoted : NumberLong(9223372036854775807) } ) 突出显示的行会在旧版
mongo
shell 中产生错误。mongosh
插入成功。
NumberDecimal
版本 3.4 中的新增功能。
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
中有所不同。带引号的string格式
NumberDecimal("123.40")
已弃用。 插入成功,但也产生警告。不带引号的string格式
NumberDecimal(123.40)
会将值存储为123.4
。 末尾的0
被删除。