优秀的编程知识分享平台

网站首页 > 技术文章 正文

mongodb——MongoDB的扩展JSON(v2)

nanyue 2024-11-11 12:27:37 技术文章 1 ℃

本页面讨论的是MongoDB Extended JSON v2。如果想了解关于遗留版本的MongoDB Extended JSON v1,请参阅《MongoDB Extended JSON(v1)》。

如果您想了解mongo shell中数据类型的包装方法,请参阅《mongo shell中的数据类型》。

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

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

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

MongoDB Extended JSON v2.0可以在以下驱动程序中使用:

  • C
  • C++
  • Go
  • Java
  • Node.js
  • Perl
  • PHP
  • Python
  • Scala

对于使用遗留版本MongoDB Extended JSON v1的C#和Ruby,请参考《MongoDB Extended JSON(v1)》。

此外,从MongoDB 4.2版本开始,MongoDB数据库工具也支持使用MongoDB Extended JSON v2.0格式。

二进制

更改

bsondump

使用扩展的 JSON v2.0(规范模式)格式。

mongodump

使用扩展的 JSON v2.0(规范模式)格式来存储元数据。要求 mongorestore 版本 4.2 或更高,支持 Extended JSON v2.0(规范模式或宽松模式)格式。

TIP

一般来说,使用相应版本的 mongodump 和 mongorestore。也就是说,要恢复由特定版本的 mongodump 创建的数据文件,请使用相应版本的 mongorestore。

mongoexport

默认情况下,使用扩展的 JSON v2.0(宽松模式)格式创建输出数据。

如果使用 --jsonFormat 参数,则会创建使用扩展的 JSON v2.0(规范模式)格式的输出数据。

mongoimport

默认情况下,导入数据时期望使用扩展的 JSON v2.0格式(宽松模式或规范模式)。

如果指定了 --legacy 选项,则可以识别使用扩展的 JSON v1.0 格式的数据。

TIP

一般来说,mongoexport 和 mongoimport 的版本应该匹配。也就是说,从 mongoexport 创建的数据文件要导入时,应该使用相应版本的 mongoimport 进行操作。

BSON数据类型及其相关表示方式:

以下是一些常见的BSON数据类型及其在规范和松散表示中的相关表示方式:

  • Array
  • Binary
  • Date


  • Decimal128
  • Document
  • Double
  • Int32
  • Int64
  • MaxKey
  • MinKey
  • ObjectId
  • Regular Expression
  • Timestamp

完整列表请参见:
https://github.com/mongodb/specifications/blob/master/source/extended-json.rst#conversion-table

数组(Array)


规范化

松散化

[ <elements> ]
<同规范化>

其中数组元素如下:

  • <elements>
    • 数组元素使用扩展JSON。
    • 要指定一个空数组,请省略内容 [ ]。

二进制(Binary)


规范化

松散化

{ 
  "$binary":   { 
    "base64": "<payload>", 
    "subType": "<t>"   
  }
}
<同规范化>

其中值的含义如下:

  • "<payload>":Base64编码(使用“=”填充)的有效字符串。
  • "<t>":一个或两个字符的十六进制字符串,对应于BSON二进制子类型。可参考扩展BSON文档 http://bsonspec.org/spec.html 以获取可用的子类型。

Date


对于年份在1970年至9999年之间(包括两端)的日期:

规范化

松散化

{
  "$date": {
    "$numberLong": "<millis>"
  }
}
{"$date": "<ISO-8601 Date/Time Format>"}

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

规范化

松散化

{
  "$date": {
    "$numberLong": "<millis>"
  }
}
<同规范化>

其中值的含义如下:

  • "<millis>"
    • 一个64位有符号整数的字符串。该值表示相对于纪元的毫秒数。
  • "<ISO-8601 Date/Time Format>"
    • 一个以字符串形式表示的ISO-8601互联网日期/时间格式的日期。
    • 该日期/时间的最大时间精度为毫秒:
      • 如果小数部分不为零,则小数秒精确到三个小数位。
      • 否则,如果小数部分为零,则应省略小数秒。

Decimal128


从版本3.4开始新增。

规范化

松散化

{ 
  "$numberDecimal": "<number>" 
}
<同规范化>

其中值的含义如下:

  • "<number>"
    • 高精度小数作为字符串。

Document


规范化

松散化

{ <content> }
<同规范化>

其中值的含义如下:

  • <content>
    • 使用扩展JSON的(名称:值)对。
    • 要指定一个空文档,请省略内容 { }。

Double


对于有限数字:

规范化

松散化

{
  "$numberDouble": "<decimal string>" 
}
<non-integer number>

对于无限数字或NaN:

规范化

松散化

{"$numberDouble": <"Infinity"|"-Infinity"|"NaN"> }
<同规范化>

其中值的含义如下:

  • "<decimal string>"
    • 一个64位有符号浮点数的字符串。
  • <non-integer number>
    • 一个非整数数字。整数数字将被解析为整数而不是双精度浮点数。

Int64


规范化

松散化

{ "$numberLong": "<number>" }
<integer>

其中值的含义如下:

  • "<number>"
    • 一个64位有符号整数的字符串。
  • <integer>
    • 一个64位有符号整数。

Int32


规范化

松散化

{ "$numberInt": "<number>" }
<integer>

其中值的含义如下:

  • "<number>"
    • 一个32位有符号整数的字符串。
  • <integer>
    • 一个32位有符号整数。

MaxKey


规范化

松散化

{ "$maxKey": 1 }
<同规范化>

最大键值的BSON数据类型比所有其他类型都要高。有关BSON类型比较顺序的更多信息,请参见比较/排序顺序。

MinKey


规范化

松散化

{ "$minKey": 1 }
<同规范化>

最小键值的BSON数据类型比所有其他类型都要低。有关BSON类型比较顺序的更多信息,请参见比较/排序顺序。

ObjectId


规范化

松散化

{ "$oid": "<ObjectId bytes>" }
<同规范化>

其中值的含义如下:

  • "<ObjectId bytes>"
    • 一个24个字符的大端十六进制字符串,表示ObjectId字节。

Regular Expression


规范化

松散化

{ 
  "$regularExpression":   { 
    "pattern": "<regexPattern>",      
    "options": "<options>"  
  }
}
<同规范化>

其中值的含义如下:

  • "<regexPattern>"
    • 与正则表达式模式对应的字符串。该字符串可以包含有效的JSON字符和未转义的双引号(")字符,但不能包含未转义的斜杠(/)字符。
  • "<options>"
    • 一个指定BSON正则表达式选项('g'、'i'、'm'和's')的字符串,或一个空字符串""。
    • 转换为此表示形式时,除了('g'、'i'、'm'和's')之外的选项都将被删除。

IMPORTANT

这些选项必须按字母顺序排列。

Timestamp


规范化

松散化

{
  "$timestamp": {
    "t": <t>, 
    "i": <i>
  }
}
<同规范化>

其中值的含义如下:

  • <t>
    • 自纪元以来的秒数的正整数。
  • <i>
    • 一个正整数,表示增量。

示例

示例字段名称

规范格式

松散格式

"_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}}

最近发表
标签列表