在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ū)⑴cbson.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í),例如 排序字段析既,插入新文檔