mongoDB -BSON

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

  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.如果字段值相等,則比較下一個鍵/值對(返回步驟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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草巡,一起剝皮案震驚了整個濱河市守呜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌山憨,老刑警劉巖查乒,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萍歉,居然都是意外死亡侣颂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門枪孩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憔晒,“玉大人,你說我怎么就攤上這事蔑舞【艿#” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵攻询,是天一觀的道長从撼。 經(jīng)常有香客問我,道長钧栖,這世上最難降的妖魔是什么低零? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任婆翔,我火速辦了婚禮,結(jié)果婚禮上掏婶,老公的妹妹穿的比我還像新娘啃奴。我一直安慰自己,他們只是感情好雄妥,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布最蕾。 她就那樣靜靜地躺著,像睡著了一般老厌。 火紅的嫁衣襯著肌膚如雪瘟则。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天枝秤,我揣著相機與錄音醋拧,去河邊找鬼。 笑死宿百,一個胖子當(dāng)著我的面吹牛趁仙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垦页,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼雀费,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痊焊?” 一聲冷哼從身側(cè)響起盏袄,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄啥,沒想到半個月后辕羽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡垄惧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年刁愿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片到逊。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡铣口,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出觉壶,到底是詐尸還是另有隱情脑题,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布铜靶,位于F島的核電站叔遂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜已艰,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一痊末、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哩掺,春花似錦舌胶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辆它。三九已至誊薄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锰茉,已是汗流浹背呢蔫。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留飒筑,地道東北人片吊。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像协屡,于是被迫代替她去往敵國和親俏脊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

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