【Go - 什么有序?解密MongoDB bson.D】

在Go進(jìn)行MongoDB的查詢(xún)何缓,插入等語(yǔ)句的運(yùn)行時(shí)株汉,總是會(huì)用到bson.D。

對(duì)于bson.D歌殃,官方文檔中的解釋是有序的乔妈,這也是其與bson.M的一大區(qū)別。但是這個(gè)有序的到底是指什么有序氓皱,檢索時(shí)使用索引有序路召,還是插入時(shí)按順序更新?其和bson.M的具體區(qū)別是什么波材。下面讓我們來(lái)一探究竟股淡,

基礎(chǔ)用法

bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}

典型用法

filter := bson.D{{"foo", "bar"}, {"hello", "world"}}
var result bson.D
err = collection.FindOne(context.TODO(), filter).Decode(&result)

VS bson.M

bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}

可以看出,對(duì)比bson.M 和 bson.D

  • bson.M是個(gè)map類(lèi)型廷区,典型的哈希形式唯灵。
  • bson.D傳遞的是一個(gè)數(shù)組。

源碼

再看眼源碼

type D = primitive.D
package primitive 

type D []E

type E struct {
  Key   string
  Value interface{}
}

bson.D就是有序數(shù)組隙轻,里面可包含多個(gè)struct E埠帕,E由 Key 和 Value 構(gòu)成。

到底是什么有序

那么至此玖绿,回到文題 bson.D的有序 敛瓷,是什么有序 ,什么時(shí)候有用斑匪,什么時(shí)候無(wú)用呐籽。

1. 什么時(shí)候用 bson.D

  • 排序字段:當(dāng)你指定排序字段時(shí),字段的順序非常重要。例如狡蝶,按字段 A 排序然后按字段 B 排序庶橱,可能與先按字段 B 排序然后按字段 A 排序的結(jié)果完全不同。因此贪惹,當(dāng)你指定一個(gè)包含多個(gè)字段的排序文檔時(shí)苏章,應(yīng)該使用 bson.D

    示例:

    sort := bson.D{
        {"age", 1},  // 先按年齡升序排序
        {"name", 1}, // 然后按名字升序排序
    }
    
    
  • 插入新文檔:當(dāng)你插入一個(gè)新文檔時(shí)馍乙,如果你希望所有文檔中的字段順序一致,應(yīng)該使用 bson.D垫释。使用 bson.M 時(shí)丝格,字段的順序不保證一致,而使用 bson.D 時(shí)棵譬,保存的文檔中的字段順序?qū)⑴c bson.D 中列出的順序匹配显蝌。

    示例:

    newDoc := bson.D{
        {"name", "Alice"},
        {"age", 25},
        {"location", "New York"},
    }
    
    

2. 什么時(shí)候不用 bson.D

  • 過(guò)濾條件:當(dāng)你在構(gòu)建 MongoDB 查詢(xún)的過(guò)濾條件時(shí),字段的順序通常不重要订咸。MongoDB 服務(wù)器足夠智能曼尊,可以根據(jù)索引找到匹配的記錄,無(wú)論字段的順序如何脏嚷。

    換句話(huà)說(shuō)骆撇,MongoDB中使用聯(lián)合索引檢索的時(shí)候,不用多操心聯(lián)合索引 父叙,多個(gè)查詢(xún)索引的排列順序神郊,誰(shuí)先放在前面 誰(shuí)放在后面,MongoDB 內(nèi)部有機(jī)制能保障 無(wú)論怎么排序趾唱,只要索引存在 都可以命中且內(nèi)部有調(diào)優(yōu)的涌乳,不用太多費(fèi)心。

    因此甜癞,在這種情況下夕晓,可以使用 bson.M,可以更簡(jiǎn)短些悠咱。

示例:

filter := bson.M{
    "name": "Alice",
    "age": 25,
}

總結(jié):

  • 使用 bson.M:當(dāng)字段順序不重要時(shí)蒸辆,例如 篩選條件
  • 使用 bson.D:當(dāng)字段順序重要時(shí),例如 排序字段析既,插入新文檔
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吁朦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子渡贾,更是在濱河造成了極大的恐慌逗宜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纺讲,居然都是意外死亡擂仍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)熬甚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逢渔,“玉大人,你說(shuō)我怎么就攤上這事乡括∷嗬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵诲泌,是天一觀的道長(zhǎng)盲赊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)敷扫,這世上最難降的妖魔是什么哀蘑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮葵第,結(jié)果婚禮上绘迁,老公的妹妹穿的比我還像新娘。我一直安慰自己卒密,他們只是感情好缀台,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哮奇,像睡著了一般将硝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屏镊,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天依疼,我揣著相機(jī)與錄音,去河邊找鬼而芥。 笑死律罢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棍丐。 我是一名探鬼主播误辑,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歌逢!你這毒婦竟也來(lái)了巾钉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秘案,失蹤者是張志新(化名)和其女友劉穎砰苍,沒(méi)想到半個(gè)月后潦匈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赚导,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年茬缩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吼旧。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凰锡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出圈暗,到底是詐尸還是另有隱情掂为,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布员串,位于F島的核電站勇哗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昵济。R本人自食惡果不足惜智绸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一野揪、第九天 我趴在偏房一處隱蔽的房頂上張望访忿。 院中可真熱鬧,春花似錦斯稳、人聲如沸海铆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卧斟。三九已至,卻和暖如春憎茂,著一層夾襖步出監(jiān)牢的瞬間珍语,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工竖幔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留板乙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓拳氢,卻偏偏與公主長(zhǎng)得像募逞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馋评,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評(píng)論 2 89
  • 一放接、Mongodb概述 我們都知道各種基于SQL的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),如Mysql留特、Postgresql纠脾、sql...
    GoFuncChan閱讀 1,330評(píng)論 0 1
  • MongoDB MongoDB 是由C++語(yǔ)言編寫(xiě)的玛瘸,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源非關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)(NoSQL)...
    茍且_7c59閱讀 252評(píng)論 0 0
  • mongoDB基礎(chǔ) 一、MongoDB簡(jiǎn)介 MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)乳乌,提供高性能捧韵、高可用性...
    voidFan閱讀 606評(píng)論 0 4
  • Bson是什么 bson 是 MongoDB 使用的一種二進(jìn)制編碼格式,全稱(chēng)為 Binary JSON汉操。它用于存儲(chǔ)...
    wn777閱讀 161評(píng)論 0 0