微服務管理平臺nacos虛擬ip負載均衡集群模式搭建
911
2025-04-02
文章目錄
1. MongoDB簡介
2. Go連接MongoDB
3. insert 插入
3.1 插入單條數據
3.2 插入多條數據
4. find 查詢
4.1 單條查詢
4.2 多條查詢
4.3 復合查詢
4.3.1 $regex 模糊查詢
4.3.2 in($in)
4.3.3 各種比較函數
4.3.4 復合查詢
4.3.5 聚類
`$sum`例子:
`$avg` 例子
`$min例子`
5. update 更新
5.1 更新單條
5.2 更新多條
6. delete 刪除
6.1 刪除單條
6.2 刪除多條
1. MongoDB簡介
MongDB是一款性能極強的文檔數據庫,可以充分利用系統的內存資源,會充分使用系統內存作為緩存。
在MongoDB中,指定索引插入比不指定慢很多,這是因為,MongoDB里每一條數據的_id值都是唯一的。
當在不指定_id插入數據的時候,其_id是系統自動計算生成的。MongoDB通過計算機特征值、時間、進程ID與隨機數來確保生成的_id是唯一的。
而在指定_id插入時,MongoDB每插一條數據,都需要檢查此_id可不可用,當數據庫中數據條數太多的時候,這一步的查詢開銷會拖慢整個數據庫的插入速度
MongoDB不指定_id插入 > MySQL不指定主鍵插入 > MySQL指定主鍵插入 > MongoDB指定_id插入
2. Go連接MongoDB
驅動:go.mongodb.org/mongo-driver/mongo
定義一個mongoDB的一個client
var MongoDBClient *mongo.Client
1
連接mongoDB
clientOptions := options.Client().ApplyURI("mongodb://" + "localhost" + ":" + "27017") var err error MongoDBClient, err = mongo.Connect(context.TODO(), clientOptions) // 鏈接 if err != nil { fmt.Println(err) } err = MongoDBClient.Ping(context.TODO(), nil) // 測試連接 if err != nil { fmt.Println(err) }
1
2
3
4
5
6
7
8
9
10
11
12
var Collection *mongo.Collection // 聲明一個集合 Collection = MongoDBClient.Database("practice").Collection("user") // 鏈接practice這個數據庫中的user集合
1
2
3
MongoDB數據庫 —> MySql數據庫
MongoDB的Collection集合 —> MySQL表
注意一點:這時候如果MongoDB中沒有這個數據庫和這個集合的話,就會自動創建的,無需我們自己再去創建集合
3. insert 插入
定義一個類型
type PersonInfo struct { Name string Age float64 Major string }
1
2
3
4
5
3.1 插入單條數據
定義數據
fan := PersonInfo{"FanOne", 17.99, "Big Data"}
1
插入
insertResult, err := Collection.InsertOne(context.TODO(), fan)
1
查看插入結果的id
fmt.Println(insertResult.InsertedID)
1
3.2 插入多條數據
在MongoDB中我們看到這個InsertMany的函數的實際上是要傳入一個[]interface{}類型的
聲明數據類型
var fans []interface{}
1
bson.M{}
在go.mongodb中有兩種族來使用bson數據,分別是D和RAW。
D族是使用原生Go形式來構造一個BSON對象。這個對于使用命令來操作mongoDB是十分有用的。
D()由下面4種類型:
D:一個BSON文檔,這個是有序的。
M:一個無序的map。它除了無序之外和D是一樣的(可以理解為map和bson是可以轉換)。
A:一個BSON形式的數組。
E:一個D里面的單獨元素。(就是文檔里的一個元素)
RAW族是被用來判斷是否為bytes的一個slice。
你也可以用look up()方法從RAW取得一個元素。這可以在你將BSON轉化為另一個形式的數 據時是十分有用的(原文大概意思是可以節省你轉化數據時的開銷)。
for i := 0; i <= 10; i++ { fan := PersonInfo{"FanOne", 17.99, "Big Data"} fan.Name = fan.Name + strconv.Itoa(i) fans = append(fans, bson.M{"name": fan.Name, "age": fan.Age, "major": fan.Major}) } insertResult, err := Collection.InsertMany(context.TODO(), fans) // 插入多條數據 if err != nil { fmt.Println(err) } fmt.Println(insertResult.InsertedIDs)
1
2
3
4
5
6
7
8
9
10
11
4. find 查詢
4.1 單條查詢
定義查詢結果
var result PersonInfo
1
定義篩選條件
filter := bson.D{{"name", "FanOne0"}}
1
選擇
err := Collection.FindOne(context.TODO(), filter).Decode(&result) // 將結果Decode到result中 if err != nil { log.Fatal(err) } fmt.Printf("Found a single document: %+v\n", result)
1
2
3
4
5
6
結果
4.2 多條查詢
定義查詢結果
var result []PersonInfo
1
定義過濾器
filter := bson.D{{"major", "Big Data"}}
1
數據庫查詢
res,err := Collection.Find(context.TODO(), filter)
1
結果賦值
_ = res.All(context.TODO(), &result)
1
結果
4.3 復合查詢
4.3.1 $regex 模糊查詢
查詢名字包含1的數據
filter := bson.M{"name": bson.M{"$regex":"1"}}
1
查詢
res,err := Collection.Find(context.TODO(), filter) if err != nil { log.Fatal(err) } _ = res.All(context.TODO(), &result) fmt.Printf("result : %+v\n", result)
1
2
3
4
5
6
查詢結果
4.3.2 in($in)
查詢name字段中有FanOne1和FanOne2的數據字段
filter := bson.M{"name": bson.M{"$in":[]string{"FanOne1","FanOne2"}}}
1
查詢字段
如果是查詢不存在就用 no in($nin) 關鍵字 進行查詢
4.3.3 各種比較函數
!=($ne)
> ($gt)
< ($lt)
>=($gte)
<=($lte)
例子:
filter := bson.M{"age": bson.M{"$gt": 1}}
1
選出age>1的數據
4.3.4 復合查詢
and($and)
查詢 name是FanOne2 和 age是4 的數據
res, err := Collection.Find(context.TODO(), bson.M{"$and": []bson.M{{"name": "FanOne2"}, {"age": 4}}})
1
結果
or($or)
查詢 name是FanOne2 或者 age是2 的數據
res, err := Collection.Find(context.TODO(), bson.M{"$or": []bson.M{{"name": "FanOne2"}, {"age": 2}}})
1
結果
4.3.5 聚類
類似:
select by_user, count(*) from mycol group by by_user
查看Aggregate的源碼可知
$sum例子:
定義最大時間
opts := options.Aggregate().SetMaxTime(2 * time.Second)
1
定義查詢語句
通過major字段進行劃分,每一個sum變1
groupStage := bson.D{ {"$group", bson.D{ {"_id", "$major"}, {"sum", bson.D{ {"$sum", 1}, }}, }}, }
1
2
3
4
5
6
7
8
查詢
result, err := Collection.Aggregate(context.TODO(), mongo.Pipeline{groupStage}, opts)
1
賦值,注意這里類型可以自己定義,也可以直接用bson.M
var results []bson.M if err = result.All(context.TODO(), &results); err != nil { log.Fatal(err) } fmt.Printf("results : %+v\n", results)
1
2
3
4
5
$avg 例子
定義一個過濾條件
計算各個major的平均age字段
groupStage := bson.D{{"$group",bson.D{{"_id","$major"},{"ageAvg",bson.D{{"$avg","$age"},}},}},}
1
數據庫
結果
$min例子
找到以major為分組,各組最小的age
groupStage := bson.D{{"$group",bson.D{{"_id","$major"},{"minAvg",bson.D{{"$min","$age"}}}}}}
1
5. update 更新
5.1 更新單條
第一個是filter,選出哪個更新,第二個是傳進去的更新的東西,要傳$set
res, err := Collection.UpdateOne(context.TODO(), bson.M{"name": "FanOne1"}, bson.M{"$set": bson.M{"age": 111}})
1
結果
5.2 更新多條
UpdateMany
找到字段major是BigData的,然后把age變成111。
res, err := Collection.UpdateMany(context.TODO(), bson.M{"major": "Big Data"}, bson.M{"$set": bson.M{"age": 111}})
1
結果
6. delete 刪除
6.1 刪除單條
res, err := Collection.DeleteOne(context.TODO(), bson.M{"name": "FanOne0"}) if err != nil { log.Fatal(err) } fmt.Printf("result : %+v\n", res)
1
2
3
4
5
6.2 刪除多條
res, err := Collection.DeleteMany(context.TODO(), bson.M{"major": "CS"}) if err != nil { log.Fatal(err) } fmt.Printf("result : %+v\n", res)
1
2
3
4
5
Go MongoDB
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。