【MongoDB】BSON类型
目錄
一、ObjectId
二、字符串(String)
三、時間戳(Timestamps)
四、日期(Date)
BSON是一種二進制序列化格式,用于在MongoDB中存儲文檔和進行遠程過程調用。 有關BSON規范請訪問bsonspec.org。
每種BSON類型標識符都具有整數和字符串兩種表示方式,如下表:
| 類型 | 編號 | 別名 | 注釋 |
| Double | 1 | “double” | ? |
| String | 2 | “string” | ? |
| Object | 3 | “object” | ? |
| Array | 4 | “array” | ? |
| Binary Data | 5 | “binData” | ? |
| Undefined | 6 | “undefined” | Deprecated(已廢棄) |
| objectId | 7 | “objectId” | ? |
| Boolean | 8 | “bool” | ? |
| Date | 9 | “date” | ? |
| Null | 10 | “null” | ? |
| Regular Expression | 11 | “regex” | ? |
| DBPointer | 12 | “dbPointer” | Deprecated(已廢棄) |
| JavaScript | 13 | “javascript” | ? |
| Symbol | 14 | “symbol” | Deprecated(已廢棄) |
| JavaScript code with scope | 15 | “javascriptWithScope” | Deprecated?in MongoDB 4.4 |
| 32-bit integer | 16 | “int” | ? |
| Timestamp | 17 | “timestamp” | ? |
| 64-bit integer | 18 | “long” | ? |
| Decimal128 | 19 | “decimal” | New in version 3.4 |
| Min?Key | -1 | “minKey” | ? |
| Max?Key | 127 | “maxKey” | ? |
- $ type運算符支持使用這些值根據BSON類型查詢字段。 $ type還支持類型編號的別名,該別名與integer, decimal, double, 和?long?BSON類型匹配。
- $ type聚合運算符返回其參數的BSON類型。
- 如果$ isNumber聚合運算符的參數為BSON類型integer, decimal, double, 或?long.,則返回true。(New in version 4.4)
注:$ type用于篩選字段值是指定的BSON?type(s)類型的文檔。例如:
{ field: { $type: <BSON type> } }
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
要查看字段類型,請參閱mongo Shell檢查字段類型。
將BSON轉換為JSON,請參閱MongoDB擴展的JSON。
以下各節描述了BSON類型需要特別注意的事項。
?
一、ObjectId
ObjectId比較小,還是唯一的,可以快速生成并排序。ObjectId值的長度為12個字節,包括:
- 4字節的時間戳(自Unix時代以來以秒為單位的時間戳值),代表ObjectId的創建
- 5字節的隨機值
- 3字節的遞增計數器,初始化值是隨機值
雖然BSON格式本身是低位字節序,但時間戳和計數器值卻是高位字節序,最有效字節出現在字節序列前端。
字節序,顧名思義字節的順序,就是大于一個字節類型的數據在內存中的存放順序(一個字節的數據當然就無需談順序的問題了)。
字節序分為兩類:Big-Endian和Little-Endian,定義如下:
a) Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
b) Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
c) 網絡字節序:TCP/IP各層協議將字節序定義為Big-Endian,因此TCP/IP協議中使用的字節序通常稱之為網絡字節序。
在MongoDB中,存儲在集合中的每個文檔都需要一個唯一的_id字段作為主鍵。如果插入的文檔省略_id字段,則MongoDB驅動程序會自動為_id字段生成ObjectId類型值。
同理,通過upsert:true更新操作插入的文檔時,若_id字段省略,也自動生成。
MongoDB客戶端應添加一個唯一ObjectId值的_id字段。在_id字段中使用ObjectIds具有以下額外優點:
- 通過mongo shell,可以使用ObjectId.getTimestamp()方法查看ObjectId的創建時間。
- 在存儲ObjectId值的_id字段上進行排序大致相當于按創建時間進行排序。
重要提示
盡管ObjectId值應隨時間增加,但不一定是單調的。這是因為他們:
- ObjectId僅包含秒級時間戳,因此在同一秒內創建的ObjectId值沒有保證的順序
- 由客戶端生成,客戶端可能具有不同的系統時鐘。
參考資料:ObjectId()
?
二、字符串(String)
BSON字符串是UTF-8編碼。
通常,在對BSON進行序列化和反序列化時,每種編程語言的驅動程序都會從該語言的字符串格式轉換為UTF-8。這樣就可以輕松地將大多數國際字符存儲在BSON字符串中。 [1]此外,MongoDB $ regex查詢在regex字符串中支持UTF-8。
[1]對于一個UTF-8字符集的字符串,對字符串使用sort()是合理的。但是,由于內部sort()使用C ++ strcmp api,因此排序順序可能會錯誤地處理某些字符。
?
三、時間戳(Timestamps)
BSON有一種在MongoDB使用的特殊的內部時間戳類型,并且與常規Date類型無關。此內部時間戳記類型是64位值,其中:
- 最重要的32位是time_t值(自Unix時代以來的秒數)
- 最不重要的32位是某1秒內操作的遞增序數。
由于BSON格式為低位優先,因此首先存儲了最不重要的32位,但是mongod實例在所有平臺上始終將先比較time_t值,在比較序數值,而不管字節順序如何。
在一個mongod單實例中,時間戳值始終是唯一的。
在復本集中,操作日志(oplog)有一個ts字段。該字段值反映了BSON時間戳值的操作時間。
注意
BSON?timestamp?類型是MongoDB內部使用。大多數情況下,在應用程序開發中,需要使用BSON?date類型。更多信息,參考Date。
如果插入的文檔包含帶有空時間戳值的頂級字段時,MongoDB會將空時間戳值替換為當前時間戳值,但以下情況除外:如果_id字段本身包含空的時間戳值,則它將始終按原樣插入并且不會被替換。
例:
插入有空時間戳值的文檔:
db.test.insertOne( { ts: new Timestamp() } );然后運行db.test.find()將返回一個文檔(內容類似):
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }mongodb服務已將ts的空timestamp值替換為插入時的timestamp值。
?
四、日期(Date)
BSON Date是一個64位整數,代表自Unix紀元(1970年1月1日)到現在的毫秒數。這樣可以追溯到過去和未來約2.9億年的日期范圍。
官方的BSON規范將BSON日期類型稱為UTC日期。
BSON日期類型已簽名。 [2]負值表示1970年之前的日期。
例如,在mongo shell中使用?new Date()函數創建Date:
var mydate1 = new Date()例如,在mongo shell中使用ISODate()函數創建Date:
var mydate2 = ISODate()例如,將日期值轉成字符串:
mydate1.toString()例如,返回日期值的月份值;月索引從零開始,因此一月是月份0:
mydate1.getMonth()?
[2]在2.0版之前,Date值被誤解為無符號整數,這會影響日期字段上的排序,范圍查詢和索引。由于升級時不會重新創建索引。因此,如果使用較早版本的Date值創建了索引,并且1970年之前的日期與你的應用程序相關,請重新索引。
總結
以上是生活随笔為你收集整理的【MongoDB】BSON类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 满足各种需求,德阳人民医院Wi-Fi覆盖
- 下一篇: 多核cpu应用场景_多核?高频?不同需求