MongoDB
扩展JSON
(V2)
在本页面
MongoDB Extended JSON v2 Usage
BSON Data Types and Associated Representations
| **IMPORTANT** |
| ------------- |
| 解惑: |
下一页讨论MongoDB Extended JSON v2。关于在遗留的MongoDB Extended JSON v1的讨论,见MongoDB Extended JSON (v1)(https://www.mongodb.com/docs/v6.0/reference/mongodb-extended-json-v1/)
JSON
只能直接表示BSON
支持的类型的一个子集。 为了保存类型信息,MongoDB
在JSON
格式中添加了以下扩展。
规范模式
- 一种以牺牲可读性和互操作性为代价强调类型保存的字符串格式。也就是说,从规范到
BSON
的转换通常会保留类型信息,除非在某些特定情况下
- 一种以牺牲可读性和互操作性为代价强调类型保存的字符串格式。也就是说,从规范到
宽松模式
- 一种以牺牲类型保存为代价强调可读性和互操作性的字符串格式。也就是说,从宽松格式到
BSON
格式的转换可能会丢失类型信息。
- 一种以牺牲类型保存为代价强调可读性和互操作性的字符串格式。也就是说,从宽松格式到
两种格式都符合JSON
格式文件并且可以被各种MongoDB
驱动程序和工具解析。
MongoDB
扩展JSON v2
用法
驱动
以下驱动程序使用扩展JSON v2.0
C
C++
Go
Java
Node
Perl
PHPC
Python
Scala
对于使用遗留的
MongoDB Extended JSON v1
的c#
和Ruby
,请参考MongoDB Extended JSON (v1).。
扩展JSON
方法
MongoDB
为扩展JSON
提供了以下方法:
方法 描述
serialize 序列化BSON对象并以Extended JSON格式返回数据。
EJSON.serialize( db.<collection>.findOne() )
deserialize 将序列化文档转换为字段和值对。这些值有BSON 类型。
EJSON.deserialize( <serialized object> )
stringify 转换元素和类型将反序列化对象中的字符串配对。
EJSON.stringify( <deserialized object> )
parse 将字符串转化为元素和类型对
EJSON.parse( <string> )
有关使用示例,请参阅扩展的 JSON 对象转换。
有关更多详细信息,请参阅文档:
MongoDB
数据库工具
从4.2
版开始:
二进制 变化
bsondump 使用扩展JSON v2.0(规范模式)格式。
mongodump 元数据使用扩展 JSON v2.0(规范模式)格式。需要mongorestore支持扩展JSON v2.0(规范模式或放宽模式)格式的4.2 或更高版本。
Tip:
通常来说,mongodump和mongorestore需使用相同版本.
mongoexport 默认情况下以扩展 JSON v2.0(宽松模式)创建输出数据。
如果使用--jsonFormat,则在扩展 JSON v2.0(规范模式)中创建输出数据。
mongoimport 默认情况下,导入数据采用Extended JSON v2.0(放松模式或规范模式)。
如果指定了选项--legacy,则可以识别Extended JSON v1.0格式的数据。
Tip:
通常来说,mongoexport和mongoimport版本应该一致。
BSON
数据类型和相关的表征
下面介绍了一些常见的BSON
数据类型以及Canonical
和relax
中的相关表示。
Array
Binary
Date
Decimal128
Document
Double
Int32
Int64
MaxKey
MinKey
ObjectId
Regular Expression
Timestamp
Array
标准 宽松
[ <elements> ] <Same as Canonical>
其中数组元素如下:
- 数组元素使用
Extended JSON
。 - 若要指定空数组,请省略内容
[]
。
- 数组元素使用
Binary
标准 | 宽松 |
---|---|
{ "$binary": { "base64": "<payload>", "subType": "<t>" } } |
各值如下:
- "
" Base64
编码(填充为“=”
)有效负载字符串
- "
" - 对应于
BSON
二进制子类型的一个或两个字符的十六进制字符串
- 对应于
Date
1970
年至9999
年的日期,包括:
标准 | 宽松 |
---|---|
{"$date": {"$numberLong": "<millis>"}} |
{"$date": "<ISO-8601 Date/Time Format>"} |
对于1970
年之前或9999
年之后的日期:
标准 | 宽松 |
---|---|
{"$date": {"$numberLong": "<millis>"}} |
各值如下:
- "
" - 作为字符串的
64
位有符号整数。该值表示相对于epoch
的毫秒数。
- 作为字符串的
"<ISO-8601 Date/Time Format>"
- 在 ISO-8601 Internet Date/Time Format的日期作为字符串
date/time
的最大时间精度为毫秒:- 如果小数部分不为零,小数秒正好有
3
位小数。 - 否则,如果分数秒为零,则应省略。
- 如果小数部分不为零,小数秒正好有
Decimal128
标准 | 宽松 |
---|---|
{ "$numberDecimal": "<number>" } |
<Same as Canonical> |
各值如下:
"<number>"
- 一个高精度小数 作为一个字符串。
Document
标准 | 宽松 |
---|---|
{ <content> } |
<Same as Canonical> |
其中document
内容如下:
<content>
Name:value pairs
使用Extended JSON
。- 若要指定一个空文档,请省略内容
{}
。
Double
对于有限数
标准 | 宽松 |
---|---|
{"$numberDouble": "<decimal string>" } |
对于无限数或NAN
:
标准 | 宽松 | ||
---|---|---|---|
`{"$numberDouble": <"Infinity" | "-Infinity" | "NaN"> }` |
各值如下:
"<decimal string>"
- 作为字符串的64位有符号浮点数。
- 一个非整数。整数被解析为整数而不是双精度数。
Int64
标准 | 宽松 |
---|---|
{ "$numberLong": "<number>" } |
各值如下:
- "
" - 作为字符串的64位有符号整数。
- 64位有符号整数。
Int32
标准 | 宽松 |
---|---|
{ "$numberInt": "<number>" } |
各值如下:
- "
" - 作为字符串的32位有符号整数。
- 32位有符号整数。
MaxKey
标准 | 宽松 |
---|---|
{ "$maxKey": 1 } |
<Same as Canonical> |
MaxKey BSON
数据类型比所有其他类型都要高。有关BSON类型比较顺序的更多信息,请参阅Comparison/Sort Order
顺序。
ObjectId
标准 | 宽松 |
---|---|
{ "$oid": "<ObjectId bytes>" } |
<Same as Canonical> |
各值如下:
- "
" - 表示
ObjectId
字节的24个字符的大端十六进制字符串。
- 表示
Regular Expression
标准 | 宽松 |
---|---|
{ "$regularExpression": { "pattern": "<regexPattern>", "options": "<options>" } } |
<Same as Canonical> |
各值如下:
- "
" - 对应于正则表达式模式的字符串。 字符串可以包含有效的
JSON
字符和未转义的双引号(")
字符, 但可能不包含未转义的正斜杠(/)
字符。
- 对应于正则表达式模式的字符串。 字符串可以包含有效的
- "
" - 指定
BSON
正则表达式选项('g', 'i', 'm'和's'
)的字符串或空字符串""
。
- 指定
**IMPORTANT**
选项必须按字母顺序排列。
Timestamp
标准 | 宽松 |
---|---|
{"$timestamp": {"t": <t>, "i": <i>}} |
<Same as Canonical> |
各值如下:
- 从纪元开始的秒数的正整数。
- 增量为正整数。
例子
下面的例子说明了扩展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}} |
扩展JSON
对象转换
下面的简短示例创建一个文档对象,然后使用Extended JSON
对象转换方法将对象转换为不同的形式。
Setup
在conversions
集合中创建一个document
:
db.conversions.insertOne( { insertDate: new Date() } )
mongosh
返回一个文档对象:
{
acknowledged: true,
insertedId: ObjectId("61fbaf25671c45f3f5f4074a")
}
EJSON.serialize
序列化存储在MongoDB
文档对象中的数据:
serialized = EJSON.serialize( db.conversions.findOne() )
mongosh
解析JavaScript
对象并返回前缀为“$”
types
的值:
{
_id: { '$oid': '61fbaf25671c45f3f5f4074a' },
insertDate: { '$date': '2022-02-03T10:32:05.230Z' }
}
EJSON.deserialize
反序列化序列化对象:
EJSON.deserialize( serialized )
mongosh
解析JavaScript
对象并返回默认为 mongosh
type
的值
{
_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")
}
原文链接:https://www.mongodb.com/docs/v6.0/reference/mongodb-extended-json/
译者:杨帅