BSON 是一種二進(jìn)制序列化格式持灰,用于在 MongoDB 中存儲文檔和進(jìn)行遠(yuǎn)程過程調(diào)用盒延。 詳細(xì)參考:https://bsonspec.org/
每個 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
運算符支持使用這些值按 BSON 類型查詢字段媳谁。$type
還支持匹配 等類型集合品山,稱為number
-
$type
聚合運算符返回其參數(shù)的 BSON 類型 -
$isNumber
聚合運算符: 如果其參數(shù)是 整數(shù)(32-bit integer),長整形(64-bit integer)街州、小數(shù)(double)兼丰、浮點型(decimal),則返回true
唆缴。在mongodb 4.4版本新增
常用類型詳解
1. ObjectId
全局唯一鳍征,自動有序遞增∶婊眨總共占12個字節(jié)艳丛,由三部分組成:
- 4字節(jié)的時間戳,表示ObjectId 創(chuàng)建的時間趟紊,以unix 秒為單位
- 每個進(jìn)程單獨生成的5字節(jié)的隨機值
- 3字節(jié)的遞增計數(shù)器氮双,初始值為隨機值
如果使用整數(shù)值來創(chuàng)建 ObjectId,則此時該整數(shù)值將替換時間戳
在 MongoDB 中霎匈,存儲在集合中的每個文檔都需要一個唯一的 _id 字段作為主鍵戴差。如果插入的文檔省略了 _id 字段,MongoDB 驅(qū)動程序會自動為 _id 字段生成一個 ObjectId铛嘱。 這也適用于通過帶有 upsert: true 的更新操作插入的文檔暖释。 MongoDB 客戶端應(yīng)添加具有唯一 ObjectId 的 _id 字段袭厂。將 ObjectIds 用于 _id 字段可提供以下額外好處:
- 在 mongosh 中,您可以使用
ObjectId.getTimestamp()
方法訪問 ObjectId 的創(chuàng)建時間球匕。
$ ObjectId("6278c6085f51ccd692ec9a10").getTimestamp()
ISODate("2022-05-09T07:43:04.000Z")
- 對存儲 ObjectId 值的 _id 字段進(jìn)行排序大致相當(dāng)于按創(chuàng)建時間排序
注意:雖然 ObjectId 值應(yīng)隨時間增加纹磺,但它們不一定是單調(diào)的。
這是因為他們: 秒級別的時間分辨率亮曹,因此在同一秒內(nèi)創(chuàng)建的 ObjectId 值沒有保證順序橄杨,并且 時間戳可能是具有不同系統(tǒng)時鐘的客戶端生成的
2. String
BSON 字符串是 UTF-8編碼的。通常乾忱,在序列化和反序列化 BSON 時讥珍,每種編程語言的驅(qū)動程序都會從語言的字符串格式轉(zhuǎn)換為 UTF-8。這使得可以輕松地將大多數(shù)國際字符存儲在 BSON 字符串中窄瘟。
此外衷佃,MongoDB $regex
查詢在正則表達(dá)式字符串中支持 UTF-8
Timestamp
BSON 提供了特殊的時間戳類型供內(nèi)部 MongoDB 使用,占64位(8字節(jié))蹄葱, 該時間戳與常規(guī)的 Date 類型無關(guān)氏义。其中:
- 最高有效 32 位是 time_t 值(自 Unix 紀(jì)元以來的秒數(shù))
- 最低有效 32 位是給定秒內(nèi)操作的遞增計數(shù)
在單個mongod實例中,時間戳值始終是唯一的图云。BSON 時間戳類型供內(nèi)部 MongoDB 使用惯悠。在大多數(shù)情況下,在應(yīng)用程序開發(fā)中竣况,請使用 BSON 日期類型(Date)
Date
BSON Date 是一個 64 位整數(shù)克婶,表示自 Unix 紀(jì)元(1970 年 1 月 1 日)以來的毫秒數(shù)。這導(dǎo)致過去和未來大約 2.9 億年的可表示日期范圍
// 獲取時間 方法一
var mydate1 = new Date()
// 方法二
var mydate2 = ISODate()
// 將日期轉(zhuǎn)化為字符串類型
mydate1.toString()
// 獲取對應(yīng)時間的月份丹泉, 注意 月份是從0開始的情萤, 1到12月 由 0~11 代表
mydate1.getMonth()
比較和排序
比較不同BSON類型的值時,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.reibang.com/p/4bcd86cd9103
3. Arrays
對于數(shù)組,小于比較或升序排序比較的是數(shù)組中的最小元素寝凌,大于比較或降序排序比較的是數(shù)組中的最大元素柒傻。
當(dāng)字段是單元素數(shù)組與非數(shù)組字段進(jìn)行比較時,比較的是數(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.如果字段值相等,則比較下一個鍵/值對(返回步驟1)祖今。沒有下一個字段的對象小于有下一個字段的對象校坑。
5. 日期和時間戳
在3.0.0版本中進(jìn)行了更改,將日期對象放在時間戳對象之前排序千诬。
在早期的版本中是將兩種對象放在一起進(jìn)行比較的耍目。
6. 不存在的字段
MongoDB將不存在的字段視為是空的BSON對象。
例如:{}和{a : null}進(jìn)行比較徐绑,那么在比較的時候邪驮,a字段和空文檔將視為等價的。
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/