JSON 所支持的类型仅是 BSON 所支持的一部分(子集). 不仅保留了类型信息, MongoDB 还为 JSON 格式增加了以下扩展:
严格模式. BSON 类型的严格模式符合JSON RFC. 任何 JSON 解析器都可以将这些严格模式的表示解析为
键/值
对; 然而, 仅有 MongoDB 内部 JSON 解析器可以识别由格式所传达的类型信息.mongo Shell 模式. MongoDB 内部 JSON 解析器和 mongo shell 都可以解析这个模式.
表现用于各种数据类型决定JSON 解析的上下文.
解析器和支持的格式
严格模式输入
下面可以解析在严格模式下类型信息的识别.
各种 MongoDB 工具的
--query
其他JSON解析器,包含 mongo shell 和 db.eval()
, 可以识别严格模式表示为键/值对, 但是没有识别类型信息.
mongo Shell模式输入
下面可以解析在 mongo shell 模式下识别类型信息.
各种 MongoDB 工具的
--query
mongo shell
严格模式输出
mongoexport and REST 和 HTTP 接口 在严格模式下输出数据.
mongo Shell模式输出
bsondump 在 mongo Shell 模式输出.
BSON 数据类型和有关表现
下面介绍 BSON 数据类型和在严格模式和 mongo Shell 模式下有关表现.
二进制
data_binary
Strict Mode | mongo Shell Mode |
---|---|
{ “$binary”: “<bindata>”, “$type”: “<t>” } | BinData ( <t>, <bindata> ) |
<bindata> 是一个二进制字符串的base64的表现形式.
<t> 是单个字节表明数据类型的表现形式. 在严格模式下, 它是一个十六进制字符串, 并且在 Shell 模式它是一个整数. 查阅BSON扩展文档. http://bsonspec.org/spec.html
Date
data_date
严格模式 | mongo Shell 模式 |
---|---|
{ “$date”: “<date>” } | new Date ( <date> ) |
在严格模式下, <date> 是一种ISO 8601
的日期格式, 带着必需的遵循以下格式的(YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>
) 的时区字段.
MongoDB JSON 解析器当前不支持加载 ISO-8601 字符串, 表示Unix纪元之前的日期. 当格式化纪元之前的日期和过去的日期, 你的系统的 time_t 类型可以存在, 使用以下格式:
{ "$date" : { "$numberLong" : "<dateAsMilliseconds>" } }
在 Shell 模式下, <date> 是JSON表示的一个64位有符号整数,赋予了自纪元UTC之后毫秒数.
Timestamp
data_timestamp
严格模式 | mongo Shell 模式 |
---|---|
{ "$timestamp": { "t": <t>, "i": <i> } } | Timestamp( <t>, <i> ) |
<t> 是一个JSON表现的自纪元到现在的32位无符号的总秒数.
<i> 是一个一直增长的32位无符号整数.
正则表达式
data_regex
严格模式 | mongo Shell 模式 |
---|---|
{ "$regex": "<sRegex>", "$options": "<sOptions>" } | /<jRegex>/<jOptions> |
<sRegex> 是一个有效的JSON字符串.
<jRegex> 是一个字符串, 包含有效的JSON字符和非转义的双引号(“)字符, 但是可能不包含非转义反斜杠(/)字符.
<sOptions> 是一个字符串包含使用字母表中的字母来表示正则表达式选项.
<jOptions> 是一个可能只包含‘g’, ‘i’, ‘m’ and ‘s’等的字符串( 版本1.9新增).
<jOptions> 是一个可能只包含‘g’, ‘i’, ‘m’ and ‘s’等的字符串( 版本1.9新增). 因为 JavaScript 和 mongo Shell 支持一个范围限制选项, 当转换为这种表示方法的时候,任何不合格的选项都将会被丢弃.
OID
data_oid
严格模式 | mongo Shell 模式 |
---|---|
{ "$oid": "<id>" } | ObjectId( "<id>" ) |
<id> 是一个24个字符的16进制字符串.
DB Reference
data_ref
严格模式 | mongo Shell 模式 |
---|---|
{ "$ref": "<name>", "$id": "<id>" } | DBRef("<name>", "<id>") |
<name> 是一个有效的JSON字符串.
<id> 是任何有效的扩展JSON类型.
Undefined 类型
data_undefined
严格模式 | mongo Shell 模式 |
---|---|
{ "$undefined": true } | undefined |
JavaScript/BSON undefined 类型的表现.
你不能在文档查询中使用undefined
. 想象下面的文档插入到people
集合中:
db.people.insert( { name : "Sally", age : undefined } )
下面的查询返回一个错误:
db.people.find( { age : undefined } )
db.people.find( { age : { $gte : undefined } } )
然而,你可以使用$type
来查询未定义的值,比如:
db.people.find( { age : { $type : 6 } } )
这个查询返回所有age
字段的值为undefined
的文档.
MinKey
data_minkey
严格模式 | mongo Shell 模式 |
---|---|
{ “$minKey”: 1 } | MinKey |
BSON数据类型 MinKey 的表现是相比之下,小于其它所有类型. 在BSON类型比较排序上查阅比较/排序 顺序的更多信息..
MaxKey
data_maxkey
严格模式 | mongo Shell 模式 |
---|---|
{ “$maxKey”: 1 } | MaxKey |
BSON数据类型 MaxKey 的表现是相比之下,大于其它所有类型. 在BSON类型比较排序上查阅比较/排序 顺序的更多信息.
NumberLong
版本2.6新功能。
data_numberlong
严格模式 | mongo Shell 模式 |
---|---|
{ “$numberLong”: “<number>” } | NumberLong( “<number>” ) |
NumberLong
是一个64位有符号整数。你必须包含括号,否则将会被解释为浮点数,导致准确性的损失。
例如,下列命令是把带括号和不带括号的整数值9223372036854775807作为一个NumberLong来插入:
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") }
下一章:https://segmentfault.com/a/11…
原文来源:https://docs.mongodb.com/manu…