【Go開源寶藏】Go語言操作 MongoDB

      網友投稿 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開源寶藏】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

      鏈接MongoDB數據庫

      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小時內刪除侵權內容。

      上一篇:word用“+”、“-”號居然能繪制表格
      下一篇:基于ssh-key實現服務器免密登陸
      相關文章
      久久亚洲精品中文字幕三区| 亚洲免费电影网站| 亚洲视频在线免费看| 亚洲精品国产精品乱码视色| 国产亚洲蜜芽精品久久| 亚洲国产午夜精品理论片在线播放 | 亚洲精品国产高清嫩草影院| 亚洲精品无码国产片| 精品亚洲AV无码一区二区三区 | 国产精品无码亚洲精品2021| 亚洲精品人成网线在线播放va| 亚洲中文字幕无码一去台湾| 亚洲精品福利你懂| 久久亚洲国产最新网站| 亚洲日本成本人观看| 亚洲一卡2卡3卡4卡5卡6卡 | 亚洲国产综合精品| 亚洲人成高清在线播放| 久久综合亚洲色HEZYO社区| 在线免费观看亚洲| 亚洲视频网站在线观看| 亚洲国产高清视频在线观看| 亚洲av无码不卡久久| 激情综合亚洲色婷婷五月APP| 国产精品亚洲综合五月天| 亚洲中文字幕无码一去台湾| 亚洲日本一线产区和二线| MM1313亚洲国产精品| 亚洲 无码 在线 专区| 亚洲日韩在线观看免费视频| 色久悠悠婷婷综合在线亚洲| 久久久久亚洲精品中文字幕| 亚洲精品一品区二品区三品区| 国产亚洲一区二区在线观看| 亚洲AV无码成人精品区天堂| 亚洲色欲www综合网| 亚洲国产成a人v在线观看| 亚洲精华国产精华精华液网站 | 亚洲人成电影亚洲人成9999网| 91嫩草私人成人亚洲影院| 亚洲一区二区三区播放在线|