BSON是一個用來存儲文檔的二進制序列化格式,而且能夠在MongoDB中遠程調用。該BSON規範位於bsonspce.org。javascript
BSON在文檔中支持下列數據類型做爲值。每一個數據類型都有相對應的數字和字符串別名用 $type 操做執行BSON類型來查詢文檔。java
類型 | 數字 | 別名 | 注意 |
---|---|---|---|
Double | 1 | 「double」 | |
String | 2 | 「string」 | |
Object | 3 | 「object」 | |
Array | 4 | 「array」 | |
Binary data | 5 | 「binData」 | |
Undefined | 6 | 「undefined」 | 已過期 |
ObjectId | 7 | 「objectId」 | |
Boolean (布爾) | 8 | 「bool」 | |
Date (日期) | 9 | 「date」 | |
Null | 10 | 「null」 | |
Regular Expression (正則表達式) | 11 | 「regex」 | |
DBPointer | 12 | 「dbPointer」 | |
JavaScript | 13 | 「javascript」 | |
Symbol | 14 | 「symbol」 | |
JavaScript (with scope) | 15 | 「javascriptWithScope」 | |
32-bit integer (32位整數) | 16 | 「int」 | |
Timestamp (時間戳) | 17 | 「timestamp」 | |
64-bit integer (32位整數) | 18 | 「long」 | |
Min key | -1 | 「minKey」 | |
Max key | 127 | 「maxKey」 |
要肯定字段的類型,請查看在Mongo Shell 中檢驗類型。
若是你像轉換BSON到JSON,請參閱JSON擴展。正則表達式
當比較不一樣BSON類型的值,MongoDB使用下面的比較順序,從低到高:mongodb
MinKey (內部類型)shell
Null編程
Numbers (ints, longs, doubles)json
Symbol, String(字符串)segmentfault
Object(對象)api
Array(數組)數組
BinData
ObjectId
Boolean(布爾)
Date(日期)
Timestamp(時間戳)
Regular Expression(正則表達式)
MaxKey
MongoDB對待一些類型是相等的,以便於比較。例如,數字類型在比較以前先進行轉換。
3.0版本發生變化:Date對象在Timestamp對象以前。此前Date對象和Timestamp對象在同一等級。
比較一個不存在的字段,他多是一個空的BSON對象。所以,在文檔中一個字段排序,在文檔{}
和{a: null}
中字段排序,這兩個文檔在排序時將會被當作是等同的。
至於數組, 小於比較或者升序排序比較數組的最小元素,大於比較或者降序排序比較數組的最大元素. 所以,當比較的值是單元素數組(好比[1]
)和非數組字段(好比2
)時, 結果在1
小於2
。空數組的比較(好比 []
)當成沒有null
或者缺乏字段的空數組。
MongoDB按照如下順序對BinData
排序:
首先, 數據的長度大小。
而後, BSON一個字節的子型。
最後,對於數據,進行逐字節比較。
如下各部分主要描述特定BSON類型的特殊注意事項。
ObjectIds 是小的,惟一的,快速生成的,可排序的。 ObjectId 值由12個字節組成,其中ObjectId的前四個字節可以表現出一個建立的時間戳,特別是:
一個4字節的表明Unix紀元以來的全部秒數的值
一個3字節的機器標識符
一個2字節的進程ID
一個3字節的計數器,包含一個隨機值
在MongoDB中, 在一個集合中存儲文檔須要一個惟一的_id字段來充當主鍵。若是在文檔中未指定_id字段,MongoDB會使用ObjectId做爲_id
字段的默認值;例如:若是一個文檔在插入的時候頂級字段不包含_id
,Mongodb驅動會增長一個包含ObjectId的_id
字段。
此外,若是mongod接收到的要插入的文檔並不包含_id
字段(例如經過更新操做執行upsert選項), mongod將會在文檔的開頭添加一個值爲ObjectId的_id
字段。
MongoDB 客戶端應該添加一個帶有惟一的ObjectId值的_id
字段。使用 ObjectId 做爲_id
字段提供瞭如下額外的好處:
在Mongo Shell中,你能夠訪問ObjectId
的建立時間,使用ObjectId.getTimestamp()模塊。
在存儲ObjectId
值的_id
字段上排序,大體至關於經過建立時間排序。
重要:
ObjectId
值和生成時間的順序關係在一秒內並非徹底一致的。若是多個系統, 或者多個進程或者線程在單一系統生成的一秒內的值;ObjectId
值並不表示一個嚴格的插入順序。 不一樣客戶端間的時鐘偏移也能夠致使一個非嚴格的值的排序,由於值是不一樣客戶端之間產生的ObjectId
值。另請參閱:ObjectId()
BSON字符串是UTF-8。通常來講,當序列化和反序列化BSON時,每一個編程語言的驅動都會從語言的字符串格式轉化爲UTF-8格式。 這使得可以很是容易的在BSON中存儲大多數國際字符。[1] 此外, MongoDB $regex 查詢在正則表達式字符串時支持UTF-8。
[1]考慮到字符串使用UTF-8字符集,在字符串上使用sort()將是很是合理的。然而,由於內部sort()使用C++ strcmp api,在處理某些字符的排序的時候可能順序會不正確。
BSON 在MongoDB中使用一個特定的時間戳類型,而且不
與常規的Date類型相關聯。時間戳的值是一個64位的值,其中:
第32位是一個 time_t
值 (自Unix紀元的秒數)
第二個32位是一個在給定的秒內操做順序
遞增的。
在單臺mongod實例中,時間戳值老是惟一的。
在複製時,oplog有一個ts
字段。這個字段的使用了BSON時間戳的值反映了操做時間。
注意: MongoDB中內部使用BSON 時間戳類型。在大多數狀況下,在應用程序中開發,你將但願使用BSON時間類型。查看Date獲取更新信息。
若是你插入一個包含頂級字段中包含一個空的BSON時間戳文檔,MongoDB服務器會將空的時間戳替換爲當前時間戳的值。例如,若是你建立一個插入帶有時間戳的文檔,在下面的插入操做中:
var a = new Timestamp(); db.test.insert( { ts: a } );
而後,db.test.find()操做將會一個相似下面的文檔:
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
若是ts
是內嵌文檔的一個字段,服務器將會把它做爲一個空的時間戳值。
2.6版本發生改變:在此以前, 服務器只會在插入文檔的第一二個字段替換空的時間戳值,包含_id
字段。如今MongoDB將只會替換頂級字段。
BSON Date 是64位整數,表明自Unix紀元(1997年1月1日)以來的毫秒數。 這個結果的可表示日期範圍是在過去和未來總共 2.9億年。
官方BSON風格指定BSON的Date類型爲UTC時間。
BSON Date 類型是有符號的。[2] 負值表示1970年以前的日期。
在 Mongo Shell中使用new Date()
來構造一個Date
對象:
var mydate1 = new Date()
在 Mongo Shell 中使用ISODate()
來構造一個Date
對象:
var mydate2 = ISODate()
將Date
的值做爲字符串返回:
mydate1.toString()
返回Date
值的月份部分;月份是從0開始索引,因此一月份是0:
mydate1.getMonth()
[2]在2.0版本以前,Date
值被錯誤的解釋爲無符號整數,這影響了排、範圍查詢和Date
字段的索引。若是你在更早的版本中建立Date
字段上建立了一個索引,由於升級的時候不會建立索引,請從新建立, 在1070年以前的日期是跟你的應用相關的。
下一章:https://segmentfault.com/a/11...
本文地址:https://docs.mongodb.com/manu...