BSON 是一種二進(jìn)制序列化格式,用于在 MongoDB 中存儲文檔和進(jìn)行遠(yuǎn)程過程調(diào)用。 詳細(xì)參考:https://bsonspec.org/
每個(gè) BSON 類型都有整數(shù)和字符串標(biāo)識符,如下表所示
數(shù)據(jù)類型
| 類型 | 整數(shù)標(biāo)識 | 別稱 | 備注 |
|---|---|---|---|
| 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 code with scope | 15 | javascriptWithScope | 在mongodb 4.4 版本丟棄 |
| 32-bit integer | 16 | int | |
| Timestamp | 17 | timestamp | |
| 64-bit integer | 18 | long | |
| Decimal128 | 19 | decimal | 在mongodb 3.4 版本新增 |
| Min key | -1 | minKey | |
| Max key | 127 | maxKey |
-
$type運(yùn)算符支持使用這些值按 BSON 類型查詢字段。$type還支持匹配 等類型集合,稱為number -
$type聚合運(yùn)算符返回其參數(shù)的 BSON 類型 -
$isNumber聚合運(yùn)算符: 如果其參數(shù)是 整數(shù)(32-bit integer),長整形(64-bit integer)、小數(shù)(double)、浮點(diǎn)型(decimal),則返回true。在mongodb 4.4版本新增
常用類型詳解
1. ObjectId
全局唯一,自動有序遞增??偣舱?2個(gè)字節(jié),由三部分組成:
- 4字節(jié)的時(shí)間戳,表示ObjectId 創(chuàng)建的時(shí)間,以unix 秒為單位
- 每個(gè)進(jìn)程單獨(dú)生成的5字節(jié)的隨機(jī)值
- 3字節(jié)的遞增計(jì)數(shù)器,初始值為隨機(jī)值
如果使用整數(shù)值來創(chuàng)建 ObjectId,則此時(shí)該整數(shù)值將替換時(shí)間戳
在 MongoDB 中,存儲在集合中的每個(gè)文檔都需要一個(gè)唯一的 _id 字段作為主鍵。如果插入的文檔省略了 _id 字段,MongoDB 驅(qū)動程序會自動為 _id 字段生成一個(gè) ObjectId。 這也適用于通過帶有 upsert: true 的更新操作插入的文檔。 MongoDB 客戶端應(yīng)添加具有唯一 ObjectId 的 _id 字段。將 ObjectIds 用于 _id 字段可提供以下額外好處:
- 在 mongosh 中,您可以使用
ObjectId.getTimestamp()方法訪問 ObjectId 的創(chuàng)建時(shí)間。
$ ObjectId("6278c6085f51ccd692ec9a10").getTimestamp()
ISODate("2022-05-09T07:43:04.000Z")
- 對存儲 ObjectId 值的 _id 字段進(jìn)行排序大致相當(dāng)于按創(chuàng)建時(shí)間排序
注意:雖然 ObjectId 值應(yīng)隨時(shí)間增加,但它們不一定是單調(diào)的。
這是因?yàn)樗麄儯?秒級別的時(shí)間分辨率,因此在同一秒內(nèi)創(chuàng)建的 ObjectId 值沒有保證順序,并且 時(shí)間戳可能是具有不同系統(tǒng)時(shí)鐘的客戶端生成的
2. String
BSON 字符串是 UTF-8編碼的。通常,在序列化和反序列化 BSON 時(shí),每種編程語言的驅(qū)動程序都會從語言的字符串格式轉(zhuǎn)換為 UTF-8。這使得可以輕松地將大多數(shù)國際字符存儲在 BSON 字符串中。
此外,MongoDB $regex 查詢在正則表達(dá)式字符串中支持 UTF-8
Timestamp
BSON 提供了特殊的時(shí)間戳類型供內(nèi)部 MongoDB 使用,占64位(8字節(jié)), 該時(shí)間戳與常規(guī)的 Date 類型無關(guān)。其中:
- 最高有效 32 位是 time_t 值(自 Unix 紀(jì)元以來的秒數(shù))
- 最低有效 32 位是給定秒內(nèi)操作的遞增計(jì)數(shù)
在單個(gè)mongod實(shí)例中,時(shí)間戳值始終是唯一的。BSON 時(shí)間戳類型供內(nèi)部 MongoDB 使用。在大多數(shù)情況下,在應(yīng)用程序開發(fā)中,請使用 BSON 日期類型(Date)
Date
BSON Date 是一個(gè) 64 位整數(shù),表示自 Unix 紀(jì)元(1970 年 1 月 1 日)以來的毫秒數(shù)。這導(dǎo)致過去和未來大約 2.9 億年的可表示日期范圍
// 獲取時(shí)間 方法一
var mydate1 = new Date()
// 方法二
var mydate2 = ISODate()
// 將日期轉(zhuǎn)化為字符串類型
mydate1.toString()
// 獲取對應(yīng)時(shí)間的月份, 注意 月份是從0開始的, 1到12月 由 0~11 代表
mydate1.getMonth()
比較和排序
比較不同BSON類型的值時(shí),MongoDB使用以下從小到大的順序比較:
1 MinKey (內(nèi)部類型)
2 Null
3 Numbers (ints, longs, doubles, decimals)
4 Symbol, String
5 Object
6 Array
7 BinData
8 ObjectId
9 Boolean
10 Date
11 Timestamp
12 Regular Expression
13 MaxKey (內(nèi)部類型)
1. 數(shù)值類型
對于ints, longs, doubles, decimals 這些數(shù)值類型,MongoDB 將這些類型視為等效類型,比較之前進(jìn)行轉(zhuǎn)換
2. 字符串
默認(rèn)情況下,MongoDB將字符串轉(zhuǎn)換成二進(jìn)制來進(jìn)行比較
Collation(mongodb 3.3 版本新增)允許用戶為字符串比較指定特定的語言規(guī)則,例如字母大寫和重音符號的規(guī)則, 關(guān)于collation 詳見http://www.itdecent.cn/p/4bcd86cd9103
3. Arrays
對于數(shù)組,小于比較或升序排序比較的是數(shù)組中的最小元素,大于比較或降序排序比較的是數(shù)組中的最大元素。
當(dāng)字段是單元素?cái)?shù)組與非數(shù)組字段進(jìn)行比較時(shí),比較的是數(shù)組的元素和非數(shù)組字段的值??諗?shù)組參與比較的話,會將空數(shù)組視為小于null或缺少此字段。
4. Objects
MongoDB對BSON對象的比較使用以下順序:
1.按照鍵值對在BSON對象中出現(xiàn)的順序遞歸比較它們。
- 比較字段類型, 按照如下的從小到大的順序
MinKey (internal type)
Null
Numbers (ints, longs, doubles, decimals)
Symbol, String
Object
Array
BinData
ObjectId
Boolean
Date
Timestamp
Regular Expression
MaxKey (internal type)
3.比較關(guān)鍵字段名稱。
4.如果關(guān)鍵字段名稱相等,則比較字段值。
5.如果字段值相等,則比較下一個(gè)鍵/值對(返回步驟1)。沒有下一個(gè)字段的對象小于有下一個(gè)字段的對象。
5. 日期和時(shí)間戳
在3.0.0版本中進(jìn)行了更改,將日期對象放在時(shí)間戳對象之前排序。
在早期的版本中是將兩種對象放在一起進(jìn)行比較的。
6. 不存在的字段
MongoDB將不存在的字段視為是空的BSON對象。
例如:{}和{a : null}進(jìn)行比較,那么在比較的時(shí)候,a字段和空文檔將視為等價(jià)的。
7. BinData
MongoDB按BinData以下順序排序:
首先,比較數(shù)據(jù)的長度或大小。
然后,按BSON的一字節(jié)子類型進(jìn)行比較(one-byte subtype)。
最后,根據(jù)數(shù)據(jù)執(zhí)行逐字節(jié)比較。
參考:https://www.mongodb.com/docs/manual/reference/bson-types/