json 只能表示 bson 支持的类型的子集。
为了保留类型信息, mongodb 将以下扩展添加到 json 格式:
bson 类型的严格模式表示符合 json rfc。
任何 json 解析器都可以将这些严格的模式表示解析为 key/值对;但是, 只有 mongodb 内部 json 解析器才能识别格式传递的类型信息。
mongodb 内部 json 解析器和 mongo shell 可以分析此模式。
用于各种数据类型的表示形式取决于在其中分析 json 的上下文。
下面的内容可以在严格模式下分析表示, 并识别类型信息。
REST Interfaces
mongoimport
–query option of various MongoDB tools
MongoDB Compass
其他 json 解析器 (包括 mongo shell 和 db.eval ()) 可以将严格模式表示解析为 key/value 对, 但不识别类型信息。
下面的内容可以在mongo shell 模式下分析表示, 并识别类型信息。
REST Interfaces
mongoimport
–query option of various MongoDB tools
mongo shell
在严格模式下输出数据。
mongo shell 模式下的 bsondump 输出。
下面介绍了 “严格” 模式和 mongo 命令行模式下的 bson 数据类型和关联的表示形式。
{ "$binary": "", "$type": "" }
BinData ( , )
是二进制字符串的 base64 表示形式。
是指示数据类型的单个字节的表示形式。
在严格模式下, 它是一个十六进制字符串, 在命令行管理程序模式下, 它是一个整数。
请参阅扩展 bson 文档。http://bsonspec.org/spec.html
{ "$date": "" }
new Date ( )
在严格模式下,
是一种 iso-8601 日期格式, 其时区字段遵循模板 yyyy-mm-ddthh:mm <+/-Offset>
。
mongodb json 解析器目前不支持加载表示 unix 时代之前日期的 iso-8601 字符串。
当格式化前世纪日期和日期超过您的系统的时间 _t 类型可以容纳, 使用以下格式:
{ "$date" : { "$numberLong" : "" } }
在 shell 模式下,
是64位带符号整数的 json 表示形式, 给出自世纪 utc 以来的毫秒数。
{ "$timestamp": { "t": , "i": } }
Timestamp( , )
{ "$regex": "", "$options": "" }
//
{ "$oid": "" }
ObjectId( "" )
是一个24个字符的十六进制字符串。
{ "$ref": "", "$id": "" }
DBRef("", "")
{ "$undefined": true }
undefined
未定义类型的表示形式。
不能在查询文档中使用未定义的。请考虑插入到人员集合中的以下文档:
db.people.insert( { name : "Sally", age : undefined } )
下面的操作将返回异常
db.people.find( { age : undefined } )
db.people.find( { age : { $gte : undefined } } )
{ "$minKey": 1 }
MinKey
比较低于所有其他类型的 minkey bson 数据类型的表示形式。
有关 bson 类型的比较顺序的详细信息, 请参阅比较排序顺序。
{ "$maxKey": 1 }
MaxKey
比较高于所有其他类型的 maxkey bson 数据类型的表示形式。
有关 bson 类型的比较顺序的详细信息, 请参阅比较排序顺序。
New in version 2.6.
{ "$numberLong": "" }
NumberLong( "" )
数字龙是一个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") }
New in version 3.4.
{ "$numberDecimal": "" }
NumberDecimal( "" )
数字十进制是一个高精度的十进制。您必须包括引号, 否则输入编号将被视为双引号, 从而导致数据丢失。
例如, 以下命令将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/
MongoDB 入门教程实战学习笔记-00-目录