文档菜单
文档首页
/
MongoDB 手册
/ /

MongoDB 扩展JSON (v2)

本页内容

  • MongoDB 扩展JSON v2 使用
  • BSON 数据类型及其相关表示
  • 示例

重要

消除歧义

以下页面讨论 MongoDB 扩展JSON v2。有关对旧版 MongoDB 扩展JSON v1 的讨论,请参阅MongoDB 扩展JSON (v1).

有关在mongosh中的支持数据类型,请参阅 mongosh 数据类型。

JSON 仅能直接表示 BSON 支持类型的一个子集。为了保留类型信息,MongoDB 在 JSON 格式中添加了以下扩展。

  • 规范模式
    一种字符串格式,以牺牲可读性和互操作性为代价强调类型保留。也就是说,从规范模式到 BSON 的转换通常会保留类型信息,但在某些特定情况下除外。
  • 宽松模式
    一种字符串格式,以牺牲类型保留为代价强调可读性和互操作性。也就是说,从宽松格式到 BSON 的转换可能会丢失类型信息。

这两种格式都符合 JSON RFC,并且可以被各种 MongoDB 驱动程序和工具解析。

以下驱动程序使用Extended JSON v2.0

  • C

  • C++

  • Go

  • Java

  • Node

  • Perl

  • PHPC

  • Python

  • Scala

对于使用Legacy MongoDB Extended JSON v1的C#和Ruby,请参阅MongoDB Extended JSON (v1)。

MongoDB为Extended JSON提供以下方法

方法
描述
serialize

序列化BSON对象,并以Extended JSON格式返回数据。

EJSON.serialize( db.<collection>.findOne() )
deserialize

将序列化的文档转换为字段和值对。值具有BSON类型。

EJSON.deserialize( <serialized object> )
stringify

将反序列化对象中的元素和 类型 对对转换为字符串。

EJSON.stringify( <deserialized object> )
解析

将字符串转换为元素和 类型 对对。

EJSON.parse( <string> )

有关使用示例,请参阅下方的 扩展 JSON 对象转换

有关更多信息,请参阅

从版本 4.2 开始

二进制
更改
使用 Extended JSON v2.0(规范模式)格式。

对于元数据,使用 Extended JSON v2.0(规范模式)格式。需要 MongoDB 4.2 或更高版本的 mongorestore 支持 Extended JSON v2.0(规范模式或宽松模式)格式。

通常,使用相应版本的 mongodumpmongorestore。要恢复由特定版本的 mongodump 创建的数据文件,请使用相应版本的 mongorestore

默认情况下,创建输出数据为 Extended JSON v2.0(宽松模式)。
如果使用 --jsonFormat,则创建输出数据为 Extended JSON v2.0(规范模式)。
默认情况下,期望导入数据为 Extended JSON v2.0(宽松或规范模式)。
如果指定了选项 --legacy,则可以识别 Extended JSON v1.0 格式的数据。

通常,mongoexportmongoimport 的版本应该匹配。要从 mongoexport 导入数据,您应使用相应版本的 mongoimport

以下展示了常见的一些BSON数据类型及其在规范宽松格式下的表示。

完整的列表在这里。

数组

规范格式
宽松格式
[ <elements> ]
<Same as Canonical>

数组元素如下

  • <elements>

    • 数组元素使用扩展JSON。

    • 要指定空数组,省略内容 [ ]

二进制

规范格式
宽松格式
{ "$binary":
{
"base64": "<payload>",
"subType": "<t>"
}
}
<Same as Canonical>

其中值如下

  • "<payload>"

    • Base64编码的(带有填充字符"=")有效载荷字符串。

  • "<t>"

    • 一个或两个字符的十六进制字符串,对应于BSON二进制子类型。有关可用的子类型,请参阅扩展的bson文档http://bsonspec.org/spec.html

日期

对于1970年至9999年之间的日期(含边界):

规范格式
宽松格式
{"$date": {"$numberLong": "<millis>"}}
{"$date": "<ISO-8601 Date/Time Format>"}

对于1970年之前或9999年之后的日期:

规范格式
宽松格式
{"$date": {"$numberLong": "<millis>"}}
<Same as Canonical>

其中值如下

  • "<millis>"

    • 一个64位有符号整数(字符串形式)。该值表示相对于纪元的毫秒数。

  • "<ISO-8601 日期/时间格式>"

    • 日期/时间以字符串形式表示,遵循ISO-8601互联网日期/时间格式

    • 日期/时间最大时间精度为毫秒。

      • 如果小数部分非零,则分数秒有精确的3位小数。

      • 否则,如果为零,分数秒应当省略。

Decimal128

规范格式
宽松格式
{ "$numberDecimal": "<number>" }
<Same as Canonical>

其中值如下

文档

规范格式
宽松格式
{ <content> }
<Same as Canonical>

文档内容如下

  • <内容>

    • 使用扩展JSON的键值对。

    • 要指定空文档,省略内容 { }

Double

用于有限数字:

规范格式
宽松格式
{"$numberDouble": "<decimal string>" }
<non-integer number>

用于无限数字或 NAN:

规范格式
宽松格式
{"$numberDouble": <"Infinity"|"-Infinity"|"NaN"> }
<Same as Canonical>

其中值如下

  • "<十进制字符串>"

    • 作为字符串的 64 位有符号浮点数。

  • <非整数数字>

    • 非整数数字。整数数字被解析为整数,而不是双精度浮点数。

Int64

规范格式
宽松格式
{ "$numberLong": "<number>" }
<integer>

其中值如下

  • "<数字>"

    • 作为字符串的 64 位有符号整数。

  • <整数>

    • 64 位有符号整数。

Int32

规范格式
宽松格式
{ "$numberInt": "<number>" }
<integer>

其中值如下

  • "<数字>"

    • 一个以字符串形式表示的32位有符号整数。

  • <整数>

    • 一个32位有符号整数。

MaxKey

规范格式
宽松格式
{ "$maxKey": 1 }
<Same as Canonical>

MaxKey BSON数据类型比所有其他类型比较都高。有关BSON类型比较顺序的更多信息,请参阅比较/排序顺序

MinKey

规范格式
宽松格式
{ "$minKey": 1 }
<Same as Canonical>

MinKey BSON数据类型比所有其他类型比较都低。有关BSON类型比较顺序的更多信息,请参阅比较/排序顺序

ObjectId

规范格式
宽松格式
{ "$oid": "<ObjectId bytes>" }
<Same as Canonical>

其中值如下

  • "<ObjectId bytes>"

    • 表示 ObjectId 字节的 24 位大端十六进制字符串。

正则表达式

规范格式
宽松格式
{ "$regularExpression":
{
"pattern": "<regexPattern>",
"options": "<options>"
}
}
<Same as Canonical>

其中值如下

  • "<regexPattern>"

    • 与正则表达式模式相对应的字符串。该字符串可以包含有效的 JSON 字符和未转义的引号字符("),但不能包含未转义的斜杠字符(/)。

  • "<options>"

    • 指定 BSON 正则表达式选项的字符串。您必须按字母顺序指定选项。有关受支持选项的信息,请参阅 $options

时间戳

规范格式
宽松格式
{"$timestamp": {"t": <t>, "i": <i>}}
<Same as Canonical>

其中值如下

  • <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对象转换方法将该对象转换为不同的形式。

conversions 集合中创建一个文档

db.conversions.insertOne( { insertDate: new Date() } )

mongosh 返回一个文档对象

{
acknowledged: true,
insertedId: ObjectId("61fbaf25671c45f3f5f4074a")
}

将存储在 MongoDB 文档对象中的数据序列化

serialized = EJSON.serialize( db.conversions.findOne() )

mongosh 解析一个 JavaScript 对象,并使用以 $ 前缀的 类型:

{
_id: { '$oid': '61fbaf25671c45f3f5f4074a' },
insertDate: { '$date': '2022-02-03T10:32:05.230Z' }
}

反序列化一个序列化对象

EJSON.deserialize( serialized )

mongosh 解析一个 JavaScript 对象,并使用默认的 mongosh 类型 格式返回值

{
_id: new ObjectId( "61fbaf25671c45f3f5f4074a" ),
insertDate: ISODate( "2022-02-03T10:32:05.230Z" )
}

将对象转换为字符串

stringified = EJSON.stringify( db.conversions.findOne() )

mongosh 以字符串形式输出转换后的对象元素

{
"_id": {"$oid":"61fbaf25671c45f3f5f4074a"},
"insertDate":{"$date":"2022-02-03T10:32:05.230Z"}
}

将字符串解析为对象

EJSON.parse( stringified )

mongosh 返回转换后的字符串作为文档

{
_id: new ObjectId("61fbaf25671c45f3f5f4074a"),
insertDate: ISODate("2022-02-03T10:32:05.230Z")
}

返回

迁移未定义数据和查询

© . All rights reserved.