重要
消歧
以下页面将讨论 MongoDB 扩展 JSON v 1 (传统扩展 JSON)。 有关 MongoDB 扩展 JSON v 2的讨论,请参阅MongoDB 扩展 JSON (v 2 )。
For supported data types in mongo, see mongosh Data Types.
JSON只能表示BSON支持的类型的子集。 为了保留类型信息,MongoDB 在 JSON 格式中添加了以下扩展:
严格模式。BSON 类型的严格模式表示符合JSON RFC。任何JSON解析器都可以将这些严格模式表示解析为键/值对;但是,只有MongoDB内部JSON解析器可以识别该格式传达的类型信息。
mongoShell 模式。 MongoDB 内部 JSON 解析器和mongoShell 可以解析此模式。
各种数据类型使用的表示形式取决于解析 JSON 的上下文。
MongoDB 扩展 JSON v 1和 MongoDB 驱动程序
以下驱动程序支持扩展JSON v1.0(旧版):
C#
Ruby
注意
.NET/C# 驱动程序 3.0 及更高版本不支持严格模式,但支持 shell 模式。
有关其他驱动程序,请参阅MongoDB Extended JSON (v 2 )。
解析器和支持的格式
严格模式下的输入
以下可以通过识别类型信息来解析严格模式下的表示。
mongoimport版本4.0及更早版本--query各种 MongoDB 工具的选项
其他JSON解析器(包括mongo shell )可以将严格模式表示解析为键/值对,但无法识别类型信息。
以 mongo Shell 模式输入
以下代码可以通过识别类型信息来解析mongo shell 模式下的表示。
mongoimport版本4.0及更早版本--query各种 MongoDB 工具的选项mongoShell
以严格模式输出
Before version 4.2, mongoexport outputs data in strict mode of MongoDB Extended JSON v1.
mongo Shell 模式下的输出
Before version 4.2, bsondump outputs in mongo shell mode.
BSON 数据类型和相关表示形式
下面介绍了BSON数据类型以及严格模式和 mongo Shell模式下的关联表示。
二进制文件
data_binary- 严格模式
mongoshell模式{ "$binary": "<bindata>", "$type": "<t>" } BinData ( <t>, <bindata> )
其中的值如下所示:
<bindata>是二进制string的 base64 表示形式。<t>是指示数据类型的单个字节的表示形式。在严格模式下,它是一个十六进制字符串,在Shell模式下,它是一个整数。请参阅扩展BSON文档。 http://bsonspec.org/spec.html
Date
data_date- 严格模式
mongoshell模式{ "$date": "<date>" } new Date ( <date> ) 在严格模式下,
<date>是 ISO- 8601日期格式,模板YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>后面带有必填时区字段。在shell模式下,
<date>是 64 位带符号整数的JSON表示形式,给出自 UTC 纪元以来的毫秒数。
时间戳
data_timestamp- 严格模式
mongoshell模式{ "$timestamp": { "t": <t>, "i": <i> } } Timestamp( <t>, <i> )
其中的值如下所示:
<t>是自纪元以来的秒数的32位无符号整数的 JSON 表示形式。<i>是一个32位无符号整数,表示增量。
正则表达式
data_regex- 严格模式
mongoshell模式{ "$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- 严格模式
mongoshell模式{ "$oid": "<id>" } ObjectId( "<id>" )
其中的值如下所示:
<id>是一个包含 24 个字符的十六进制string 。
数据库引用
data_ref- 严格模式
mongoshell模式{ "$ref": "<name>", "$id": "<id>" } DBRef("<name>", "<id>")
其中的值如下所示:
<name>是string有效的JSON字符。<id>是任何有效的扩展 JSON 类型。
未定义类型
data_undefined- 严格模式
mongoshell模式{ "$undefined": true } undefined JavaScript/BSON 未定义类型的表示形式。
不能在查询文档中使用
undefined。 考虑使用旧版mongoshell 将以下文档插入到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的所有文档。重要
未定义的BSON类型已弃用。
mongosh会改为存储空值。For example, use the same code to insert a document in
mongoshand in the legacymongoshell:db.people.insertOne( { name : "Sally", age : undefined } ) 生成的文档有所不同:
{ "name" : "Sally", "age" : null } { "name" : "Sally", "age" : undefined }
最小键值
Max key
NumberLong
data_numberlong- 严格模式
mongoshell模式{ "$numberLong": "<number>" } Long( "<number>" ) NumberLong是一个 64 位有符号整数。 在旧版mongoshell 中,必须使用引号插入NumberLong,否则操作将产生错误。例如,以下命令尝试将
9223372036854775807作为NumberLong插入,在整数值两边带或不带引号:db.json.insertOne( { longQuoted : Long("9223372036854775807") } ) db.json.insertOne( { longUnQuoted : Long(9223372036854775807) } ) The highlighted line produces an error in the legacy
mongoshell. The insert succeeds inmongosh.
NumberDecimal
data_numberdecimal- 严格模式
mongoshell模式{ "$numberDecimal": "<number>" } Decimal128( "<number>" ) NumberDecimal是一个高精度十进制数。必须包含引号,否则输入的数字将被视为双精度值,从而导致数据丢失。例如,以下命令将
123.40作为NumberDecimal插入,该值带或不带引号:db.json.insertOne( { decimalQuoted : Decimal128("123.40") } ) db.json.insertOne( { decimalUnQuoted : Decimal128(123.40) } ) 检索文档时,
decimalUnQuoted的值已更改,而decimalQuoted保留其指定的精度:db.json.find() { "_id" : ObjectId("596f88b7b613bb04f80a1ea9"), "decimalQuoted" : Decimal128("123.40") } { "_id" : ObjectId("596f88c9b613bb04f80a1eaa"), "decimalUnQuoted" : Decimal128("123.400000000000") } 重要
This insert behavior is different in
mongosh.不建议使用不带引号的字符串格式
Decimal128(123.40)。 插入成功,但也产生警告。带引号的字符串格式,
Decimal128.fromStringWithRounding("123.40")会将值存储为123.4。 末尾的0被删除。