JSON 所支持的類型僅是 BSON 所支持的一部分(子集). 不只保留了類型信息, MongoDB 還爲 JSON 格式增長了如下擴展:html
嚴格模式. BSON 類型的嚴格模式符合JSON RFC. 任何 JSON 解析器均可以將這些嚴格模式的表示解析爲鍵/值
對; 然而, 僅有 MongoDB 內部 JSON 解析器能夠識別由格式所傳達的類型信息.正則表達式
mongo Shell 模式. MongoDB 內部 JSON 解析器和 mongo shell 均可以解析這個模式.mongodb
表現用於各類數據類型決定JSON 解析的上下文.shell
下面能夠解析在嚴格模式下類型信息的識別.json
REST 接口segmentfault
各類 MongoDB 工具的 --query
unix
其餘JSON解析器,包含 mongo shell 和 db.eval()
, 能夠識別嚴格模式表示爲鍵/值對, 可是沒有識別類型信息.code
下面能夠解析在 mongo shell 模式下識別類型信息.htm
各類 MongoDB 工具的 --query
mongo shell
mongoexport and REST 和 HTTP 接口 在嚴格模式下輸出數據.
bsondump 在 mongo Shell 模式輸出.
下面介紹 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
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以後毫秒數.
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 支持一個範圍限制選項, 當轉換爲這種表示方法的時候,任何不合格的選項都將會被丟棄.
data_oid
嚴格模式 | mongo Shell 模式 |
---|---|
{ "$oid": "<id>" } |
ObjectId( "<id>" ) |
<id> 是一個24個字符的16進制字符串.
data_ref
嚴格模式 | mongo Shell 模式 |
---|---|
{ "$ref": "<name>", "$id": "<id>" } |
DBRef("<name>", "<id>") |
<name> 是一個有效的JSON字符串.
<id> 是任何有效的擴展JSON類型.
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
的文檔.
data_minkey
嚴格模式 | mongo Shell 模式 |
---|---|
{ "$minKey": 1 } | MinKey |
BSON數據類型 MinKey 的表現是相比之下,小於其它全部類型. 在BSON類型比較排序上查閱比較/排序 順序的更多信息..
data_maxkey
嚴格模式 | mongo Shell 模式 |
---|---|
{ "$maxKey": 1 } | MaxKey |
BSON數據類型 MaxKey 的表現是相比之下,大於其它全部類型. 在BSON類型比較排序上查閱比較/排序 順序的更多信息.
版本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...