网站首页 > 技术文章 正文
本页面讨论的是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数据类型及其在规范和松散表示中的相关表示方式:
|
|
|
|
完整列表请参见:
https://github.com/mongodb/specifications/blob/master/source/extended-json.rst#conversion-table
数组(Array)
规范化 | 松散化 |
|
|
其中数组元素如下:
- <elements>
- 数组元素使用扩展JSON。
- 要指定一个空数组,请省略内容 [ ]。
二进制(Binary)
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<payload>":Base64编码(使用“=”填充)的有效字符串。
- "<t>":一个或两个字符的十六进制字符串,对应于BSON二进制子类型。可参考扩展BSON文档 http://bsonspec.org/spec.html 以获取可用的子类型。
Date
对于年份在1970年至9999年之间(包括两端)的日期:
规范化 | 松散化 |
|
|
对于1970年之前或9999年之后的日期:
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<millis>"
- 一个64位有符号整数的字符串。该值表示相对于纪元的毫秒数。
- "<ISO-8601 Date/Time Format>"
- 一个以字符串形式表示的ISO-8601互联网日期/时间格式的日期。
- 该日期/时间的最大时间精度为毫秒:
- 如果小数部分不为零,则小数秒精确到三个小数位。
- 否则,如果小数部分为零,则应省略小数秒。
Decimal128
从版本3.4开始新增。
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<number>"
- 高精度小数作为字符串。
Document
规范化 | 松散化 |
|
|
其中值的含义如下:
- <content>
- 使用扩展JSON的(名称:值)对。
- 要指定一个空文档,请省略内容 { }。
Double
对于有限数字:
规范化 | 松散化 |
|
|
对于无限数字或NaN:
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<decimal string>"
- 一个64位有符号浮点数的字符串。
- <non-integer number>
- 一个非整数数字。整数数字将被解析为整数而不是双精度浮点数。
Int64
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<number>"
- 一个64位有符号整数的字符串。
- <integer>
- 一个64位有符号整数。
Int32
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<number>"
- 一个32位有符号整数的字符串。
- <integer>
- 一个32位有符号整数。
MaxKey
规范化 | 松散化 |
|
|
最大键值的BSON数据类型比所有其他类型都要高。有关BSON类型比较顺序的更多信息,请参见比较/排序顺序。
MinKey
规范化 | 松散化 |
|
|
最小键值的BSON数据类型比所有其他类型都要低。有关BSON类型比较顺序的更多信息,请参见比较/排序顺序。
ObjectId
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<ObjectId bytes>"
- 一个24个字符的大端十六进制字符串,表示ObjectId字节。
Regular Expression
规范化 | 松散化 |
|
|
其中值的含义如下:
- "<regexPattern>"
- 与正则表达式模式对应的字符串。该字符串可以包含有效的JSON字符和未转义的双引号(")字符,但不能包含未转义的斜杠(/)字符。
- "<options>"
- 一个指定BSON正则表达式选项('g'、'i'、'm'和's')的字符串,或一个空字符串""。
- 转换为此表示形式时,除了('g'、'i'、'm'和's')之外的选项都将被删除。
IMPORTANT
这些选项必须按字母顺序排列。
Timestamp
规范化 | 松散化 |
|
|
其中值的含义如下:
- <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}} |
猜你喜欢
- 2024-11-11 php+json+mysql实现前后端分离(php vue前后端分离)
- 2024-11-11 PHP中json解析失败原因, json_decode返回null解析失败原因
- 2024-11-11 如何使php的数组传递到js中(如何使php的数组传递到js中)
- 2024-11-11 Python操作JSON格式数据的技巧(python解析json数据)
- 2024-11-11 Linux(centos)用yum方式安装php最新版
- 2024-11-11 PHP 8.3 正式发布!(php8.0新功能)
- 2024-11-11 使用json_encode打印中文字符并且格式化(php代码)
- 2024-11-11 PhpStorm 2022.2 已发布(phpstorm2018)
- 2024-11-11 你不知道的PHP 8.3版本和它的一些有趣的变化
- 2024-11-11 通过WordPress HTTP API 获取json内容并解析
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)