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