MongoDB 扩展JSON (v2)
重要
消除歧义
以下页面讨论 MongoDB 扩展JSON v2。有关对旧版 MongoDB 扩展JSON v1 的讨论,请参阅MongoDB 扩展JSON (v1).
有关在mongosh
中的支持数据类型,请参阅 mongosh 数据类型。
JSON 仅能直接表示 BSON 支持类型的一个子集。为了保留类型信息,MongoDB 在 JSON 格式中添加了以下扩展。
- 规范模式
- 一种字符串格式,以牺牲可读性和互操作性为代价强调类型保留。也就是说,从规范模式到 BSON 的转换通常会保留类型信息,但在某些特定情况下除外。
- 宽松模式
- 一种字符串格式,以牺牲类型保留为代价强调可读性和互操作性。也就是说,从宽松格式到 BSON 的转换可能会丢失类型信息。
这两种格式都符合 JSON RFC,并且可以被各种 MongoDB 驱动程序和工具解析。
使用MongoDB Extended JSON v2
驱动程序
以下驱动程序使用Extended JSON v2.0
|
|
|
对于使用Legacy MongoDB Extended JSON v1的C#和Ruby,请参阅MongoDB Extended JSON (v1)。
Extended JSON 方法
MongoDB为Extended JSON提供以下方法
方法 | 描述 | |
serialize | 序列化BSON对象,并以Extended JSON格式返回数据。
| |
deserialize | 将序列化的文档转换为字段和值对。值具有BSON类型。
| |
stringify | 将反序列化对象中的元素和 类型 对对转换为字符串。
| |
解析 | 将字符串转换为元素和 类型 对对。
|
有关使用示例,请参阅下方的 扩展 JSON 对象转换。
有关更多信息,请参阅
MongoDB 数据库工具
从版本 4.2 开始
二进制 | 更改 |
---|---|
使用 Extended JSON v2.0(规范模式)格式。 | |
对于元数据,使用 Extended JSON v2.0(规范模式)格式。需要 MongoDB 4.2 或更高版本的 通常,使用相应版本的 | |
默认情况下,创建输出数据为 Extended JSON v2.0(宽松模式)。 如果使用 --jsonFormat ,则创建输出数据为 Extended JSON v2.0(规范模式)。 | |
默认情况下,期望导入数据为 Extended JSON v2.0(宽松或规范模式)。 如果指定了选项 --legacy ,则可以识别 Extended JSON v1.0 格式的数据。通常, |
BSON 数据类型及其相关表示
以下展示了常见的一些BSON数据类型及其在规范和宽松格式下的表示。
完整的列表在这里。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
数组元素如下
<elements>
数组元素使用扩展JSON。
要指定空数组,省略内容
[ ]
。
规范格式 | 宽松格式 | |||||||
---|---|---|---|---|---|---|---|---|
|
|
其中值如下
"<payload>"
Base64编码的(带有填充字符"=")有效载荷字符串。
"<t>"
一个或两个字符的十六进制字符串,对应于BSON二进制子类型。有关可用的子类型,请参阅扩展的bson文档http://bsonspec.org/spec.html。
对于1970年至9999年之间的日期(含边界):
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
对于1970年之前或9999年之后的日期:
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
其中值如下
"<millis>"
一个64位有符号整数(字符串形式)。该值表示相对于纪元的毫秒数。
"<ISO-8601 日期/时间格式>"
日期/时间以字符串形式表示,遵循ISO-8601互联网日期/时间格式。
日期/时间最大时间精度为毫秒。
如果小数部分非零,则分数秒有精确的3位小数。
否则,如果为零,分数秒应当省略。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
其中值如下
"<数字>"
作为字符串的高精度小数。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
文档内容如下
<内容>
使用扩展JSON的键值对。
要指定空文档,省略内容
{ }
。
用于有限数字:
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
用于无限数字或 NAN:
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
其中值如下
"<十进制字符串>"
作为字符串的 64 位有符号浮点数。
<非整数数字>
非整数数字。整数数字被解析为整数,而不是双精度浮点数。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
其中值如下
"<数字>"
作为字符串的 64 位有符号整数。
<整数>
64 位有符号整数。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
其中值如下
"<数字>"
一个以字符串形式表示的32位有符号整数。
<整数>
一个32位有符号整数。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
MaxKey BSON数据类型比所有其他类型比较都高。有关BSON类型比较顺序的更多信息,请参阅比较/排序顺序。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
MinKey BSON数据类型比所有其他类型比较都低。有关BSON类型比较顺序的更多信息,请参阅比较/排序顺序。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
其中值如下
"<ObjectId bytes>"
表示 ObjectId 字节的 24 位大端十六进制字符串。
规范格式 | 宽松格式 | |||||||
---|---|---|---|---|---|---|---|---|
|
|
其中值如下
"<regexPattern>"
与正则表达式模式相对应的字符串。该字符串可以包含有效的 JSON 字符和未转义的引号字符(
"
),但不能包含未转义的斜杠字符(/
)。
"<options>"
指定 BSON 正则表达式选项的字符串。您必须按字母顺序指定选项。有关受支持选项的信息,请参阅
$options
。
规范格式 | 宽松格式 | ||
---|---|---|---|
|
|
其中值如下
<t>
自纪元以来的秒的正整数。
<i>
增量正整数。
示例
以下示例说明了扩展JSON的使用。
类型表示
示例字段名 | 规范格式 | 宽松格式 |
---|---|---|
"_id:" | {"$oid":"5d505646cf6d4fe581014ab2"} | {"$oid":"5d505646cf6d4fe581014ab2"} |
"arrayField" | ["hello",{"$numberInt":"10"}] | ["hello",10] |
"dateField" | {"$date":{"$numberLong":"1565546054692"}} | {"$date":"2019-08-11T17:54:14.692Z"} |
"dateBefore1970" | {"$date":{"$numberLong":"-1577923200000"}} | {"$date":{"$numberLong":"-1577923200000"}} |
"decimal128Field" | {"$numberDecimal":"10.99"} | {"$numberDecimal":"10.99"} |
"documentField" | {"a":"hello"} | {"a":"hello"} |
"doubleField" | {"$numberDouble":"10.5"} | 10.5 |
"infiniteNumber" | {"$numberDouble":"Infinity"} | {"$numberDouble":"Infinity"} |
"int32field" | {"$numberInt":"10"} | 10 |
"int64Field" | {"$numberLong":"50"} | 50 |
"minKeyField" | {"$minKey":1} | {"$minKey":1} |
"maxKeyField" | {"$maxKey":1} | {"$maxKey":1} |
"regexField" | {"$regularExpression":{"pattern":"^H","options":"i"}} | {"$regularExpression":{"pattern":"^H","options":"i"}} |
"timestampField" | {"$timestamp":{"t":1565545664,"i":1}} | {"$timestamp":{"t":1565545664,"i":1}} |
"uuid" | {"$uuid":"3b241101-e2bb-4255-8caf-4136c566a962"} | {"$uuid":"3b241101-e2bb-4255-8caf-4136c566a962"} |
扩展JSON对象转换
以下简短示例创建了一个文档对象,然后使用扩展JSON对象转换方法将该对象转换为不同的形式。
设置
在 conversions
集合中创建一个文档
db.conversions.insertOne( { insertDate: new Date() } )
mongosh
返回一个文档对象
{ acknowledged: true, insertedId: ObjectId("61fbaf25671c45f3f5f4074a") }
EJSON.serialize
将存储在 MongoDB 文档对象中的数据序列化
serialized = EJSON.serialize( db.conversions.findOne() )
mongosh
解析一个 JavaScript 对象,并使用以 $
前缀的 类型:
{ _id: { '$oid': '61fbaf25671c45f3f5f4074a' }, insertDate: { '$date': '2022-02-03T10:32:05.230Z' } }
EJSON.deserialize
反序列化一个序列化对象
EJSON.deserialize( serialized )
mongosh
解析一个 JavaScript 对象,并使用默认的 mongosh
类型 格式返回值
{ _id: new ObjectId( "61fbaf25671c45f3f5f4074a" ), insertDate: ISODate( "2022-02-03T10:32:05.230Z" ) }
EJSON.stringify
将对象转换为字符串
stringified = EJSON.stringify( db.conversions.findOne() )
mongosh
以字符串形式输出转换后的对象元素
{ "_id": {"$oid":"61fbaf25671c45f3f5f4074a"}, "insertDate":{"$date":"2022-02-03T10:32:05.230Z"} }
EJSON.parse
将字符串解析为对象
EJSON.parse( stringified )
mongosh
返回转换后的字符串作为文档
{ _id: new ObjectId("61fbaf25671c45f3f5f4074a"), insertDate: ISODate("2022-02-03T10:32:05.230Z") }