(翻譯) MongoDB(5) BSON類型

BSON是一個用來存儲文檔的二進制序列化格式,而且能夠在MongoDB中遠程調用。該BSON規範位於bsonspce.orgjavascript

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

  1. MinKey (內部類型)shell

  2. Null編程

  3. Numbers (ints, longs, doubles)json

  4. Symbol, String(字符串)segmentfault

  5. Object(對象)api

  6. Array(數組)數組

  7. BinData

  8. ObjectId

  9. Boolean(布爾)

  10. Date(日期)

  11. Timestamp(時間戳)

  12. Regular Expression(正則表達式)

  13. MaxKey
    MongoDB對待一些類型是相等的,以便於比較。例如,數字類型在比較以前先進行轉換。

3.0版本發生變化:Date對象在Timestamp對象以前。此前Date對象和Timestamp對象在同一等級。

比較一個不存在的字段,他多是一個空的BSON對象。所以,在文檔中一個字段排序,在文檔{}{a: null}中字段排序,這兩個文檔在排序時將會被當作是等同的。

至於數組, 小於比較或者升序排序比較數組的最小元素,大於比較或者降序排序比較數組的最大元素. 所以,當比較的值是單元素數組(好比[1])和非數組字段(好比2)時, 結果在1小於2。空數組的比較(好比 [])當成沒有null或者缺乏字段的空數組。

MongoDB按照如下順序對BinData排序:

  1. 首先, 數據的長度大小。

  2. 而後, BSON一個字節的子型。

  3. 最後,對於數據,進行逐字節比較。

如下各部分主要描述特定BSON類型的特殊注意事項。

ObjectId

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()

String

BSON字符串是UTF-8。通常來講,當序列化和反序列化BSON時,每一個編程語言的驅動都會從語言的字符串格式轉化爲UTF-8格式。 這使得可以很是容易的在BSON中存儲大多數國際字符。[1] 此外, MongoDB $regex 查詢在正則表達式字符串時支持UTF-8。

[1]考慮到字符串使用UTF-8字符集,在字符串上使用sort()將是很是合理的。然而,由於內部sort()使用C++ strcmp api,在處理某些字符的排序的時候可能順序會不正確。

Timestamps

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將只會替換頂級字段。

Date

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...

相關文章
相關標籤/搜索