mongo extend json
json 只能表示 bson 支持的类型的子集。
为了保留类型信息, mongodb 将以下扩展添加到 json 格式:
- 严格模式。
bson 类型的严格模式表示符合 json rfc。
任何 json 解析器都可以将这些严格的模式表示解析为 key/值对;但是, 只有 mongodb 内部 json 解析器才能识别格式传递的类型信息。
- 蒙戈外壳模式。
mongodb 内部 json 解析器和 mongo shell 可以分析此模式。
用于各种数据类型的表示形式取决于在其中分析 json 的上下文。
Parsers and Supported Format
严格模式下的输入
下面的内容可以在严格模式下分析表示, 并识别类型信息。
-
REST Interfaces
-
mongoimport
-
–query option of various MongoDB tools
-
MongoDB Compass
其他 json 解析器 (包括 mongo shell 和 db.eval ()) 可以将严格模式表示解析为 key/value 对, 但不识别类型信息。
Input in mongo Shell Mode
下面的内容可以在mongo shell 模式下分析表示, 并识别类型信息。
-
REST Interfaces
-
mongoimport
-
–query option of various MongoDB tools
-
mongo shell
严格模式下的输出
在严格模式下输出数据。
Output in mongo Shell Mode
mongo shell 模式下的 bsondump 输出。
BSON Data Types and Associated Representations
下面介绍了 “严格” 模式和 mongo 命令行模式下的 bson 数据类型和关联的表示形式。
Binary
- 严格
{ "$binary": "<bindata>", "$type": "<t>" }
- mongo shell
BinData ( <t>, <bindata> )
<bindata>
是二进制字符串的 base64 表示形式。
<t>
是指示数据类型的单个字节的表示形式。
在严格模式下, 它是一个十六进制字符串, 在命令行管理程序模式下, 它是一个整数。
请参阅扩展 bson 文档。http://bsonspec.org/spec.html
Date
- 严格模式
{ "$date": "<date>" }
- mongo shell 模式
new Date ( <date> )
在严格模式下, <date>
是一种 iso-8601 日期格式, 其时区字段遵循模板 yyyy-mm-ddthh:mm <+/-Offset>
。
mongodb json 解析器目前不支持加载表示 unix 时代之前日期的 iso-8601 字符串。
当格式化前世纪日期和日期超过您的系统的时间 _t 类型可以容纳, 使用以下格式:
{ "$date" : { "$numberLong" : "<dateAsMilliseconds>" } }
在 shell 模式下, <date>
是64位带符号整数的 json 表示形式, 给出自世纪 utc 以来的毫秒数。
Timestamp
- 严格模式
{ "$timestamp": { "t": <t>, "i": <i> } }
- mongo shell 模式
Timestamp( <t>, <i> )
Regular Expression
- 严格模式
{ "$regex": "<sRegex>", "$options": "<sOptions>" }
- mongo shell 模式
/<jRegex>/<jOptions>
OID
- Strict Mode
{ "$oid": "<id>" }
- mongo Shell Mode
ObjectId( "<id>" )
<id>
是一个24个字符的十六进制字符串。
DB Reference
- 严格模式
{ "$ref": "<name>", "$id": "<id>" }
- mongo Shell Mode
DBRef("<name>", "<id>")
Undefined Type
- 严格模式
{ "$undefined": true }
- mongo Shell Mode
undefined
未定义类型的表示形式。
不能在查询文档中使用未定义的。请考虑插入到人员集合中的以下文档:
db.people.insert( { name : "Sally", age : undefined } )
下面的操作将返回异常
db.people.find( { age : undefined } )
db.people.find( { age : { $gte : undefined } } )
MinKey
- 严格模式
{ "$minKey": 1 }
- mongo Shell Mode
MinKey
比较低于所有其他类型的 minkey bson 数据类型的表示形式。
有关 bson 类型的比较顺序的详细信息, 请参阅比较排序顺序。
MaxKey
- 严格模式
{ "$maxKey": 1 }
- mongo Shell Mode
MaxKey
比较高于所有其他类型的 maxkey bson 数据类型的表示形式。
有关 bson 类型的比较顺序的详细信息, 请参阅比较排序顺序。
NumberLong
New in version 2.6.
- 严格模式
{ "$numberLong": "<number>" }
- mongo Shell Mode
NumberLong( "<number>" )
数字龙是一个64位带符号的整数。您必须包括引号, 否则它将被解释为浮点数, 从而导致准确性的损失。
例如, 以下命令插入92233736364477807作为一个具有和不带引号的整数值:
db.json.insert( { longQuoted : NumberLong("9223372036854775807") } )
db.json.insert( { longUnQuoted : NumberLong(9223372036854775807) } )
检索文档时, “长” 取消引用 “的值已更改, 而” 长期引用 “保留其准确性:
db.json.find()
{ "_id" : ObjectId("54ee1f2d33335326d70987df"), "longQuoted" : NumberLong("9223372036854775807") }
{ "_id" : ObjectId("54ee1f7433335326d70987e0"), "longUnQuoted" : NumberLong("-9223372036854775808") }
NumberDecimal
New in version 3.4.
- 严格模式
{ "$numberDecimal": "<number>" }
- mongo Shell Mode
NumberDecimal( "<number>" )
数字十进制是一个高精度的十进制。您必须包括引号, 否则输入编号将被视为双引号, 从而导致数据丢失。
例如, 以下命令将123.40 插入为数字十进制, 其值周围有引号和不带引号:
db.json.insert( { decimalQuoted : NumberDecimal("123.40") } )
db.json.insert( { decimalUnQuoted : NumberDecimal(123.40) } )
检索文档时, 抽取的值已更改, 而抽取保留其指定的精度:
db.json.find()
{ "_id" : ObjectId("596f88b7b613bb04f80a1ea9"), "decimalQuoted" : NumberDecimal("123.40") }
{ "_id" : ObjectId("596f88c9b613bb04f80a1eaa"), "decimalUnQuoted" : NumberDecimal("123.400000000000") }
参考资料
https://docs.mongodb.com/manual/reference/mongodb-extended-json/