mongoDB -BSON

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)的順序遞歸比較它們。

  1. 比較字段類型, 按照如下的從小到大的順序

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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,306評論 2 89
  • 1 MongoDB中的基本概念及原理 1.1 MongoDB介紹 官網(wǎng)地址:https://www.mongodb...
    MiniSoulBigBang閱讀 705評論 0 0
  • MongoDB MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲的開源非關(guān)系數(shù)據(jù)庫系統(tǒng)(NoSQL)...
    茍且_7c59閱讀 346評論 0 0
  • 基本介紹 什么是NoSQL數(shù)據(jù)庫 NoSQL,指的是非關(guān)系型的數(shù)據(jù)庫。NoSQL有時(shí)也稱作Not Only SQL...
    我就是小政政閱讀 2,212評論 0 11
  • 本文主要記錄近期學(xué)習(xí) MongoDB 的一些內(nèi)容,主要參考了官方文檔 https://docs.mongodb.c...
    SheHuan閱讀 1,081評論 0 1

友情鏈接更多精彩內(nèi)容