最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Golang使用MongoDB通用操作

 更新時間:2020年12月26日 16:58:54   作者:impressionw  
這篇文章主要介紹了詳解Golang使用MongoDB通用操作,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

MongoDB是Nosql中常用的一種數(shù)據(jù)庫,今天筆者就簡單總結一下Golang如何使用這些通用的供能的,不喜勿噴。。。

       研究的事例結構如下:

type LikeBest struct {
 AuthorName string `bson:"authorname,omitempty"`
 BookName  string `bson:"bookname,omitempty"`
 PublishTime string `bson:"publishtime,omitempty"`
 LastReadTime string `bson:"lastreadtime,omitempty"`
}

type Personnal struct {
 UserName  string  `bson:"username,omitempty"`
 WhereCity  string  `bson:"wherecity,omitempty"`
 BookSCount int  `bson:"bookscount,omitempty"`
 FavoriteBooks []LikeBest `bson:"favoratebooks,omitempty"`
}

建立與MongoDB的連接

 session, err := mgo.Dial("localhost:27017")
 if err != nil {
  panic(err)
 }
 defer session.Close()

 c := session.DB("PersonManage").C("Persons")

注意:以下操作條件默認均為:username=”impressionw”

插入數(shù)據(jù)

1、使用Insert()函數(shù)是最簡單且通用的方式

err := c.Insert(&p) //p為插入的結構體數(shù)據(jù)

2、使用upsert()函數(shù)【更新或插入】

change := mgo.Change{
  Update: bson.M{"$set": p},
  ReturnNew: false,
  Remove: false,
  Upsert: true,
}
_, err := c.Find(bson.M{"username": "impressionw"}).Apply(change, nil)

       或許,你覺得第一種方式更簡潔,但是實際場景中,第二種也非常實用
        1. 它不僅只能插入數(shù)據(jù),Update字段可以接收多個參數(shù)插入,但是關鍵字不能相同【不能同時有2個”$set”】
        2. 它能返回處理前或處理后的document,若返回,則Apply的第二個參數(shù)即是結果
        3. 它可以結合select使用

注意:$set 只修改指定字段的值,不影響其他值

查詢數(shù)據(jù)

1、查詢整個文檔

err = c.Find(bson.M{"username": "impressionw"}).One(&result)

2、只返回 FavoriteBooks 對應的字段,忽略其他信息
    這里用到了Select(),select可以設置,返回的內容:

select{‘filedname':0},表示忽略該字段則結果不返回此字段
select{‘filedname':1},表示關注該字段則只返回關注字段
err = c.Find(bson.M{"username": "impressionw"}).Select(bson.M{"favoratebooks": 1}).One(&result)

3、查詢文檔的_id

var result interface{}
err = c.Find(bson.M{"username": "impressionw"}).Select(bson.M{"_id": 1}).One(&result)

var document_id string
switch value := result.(type) {
case bson.M:
 mapid := value["_id"]
 if mapid != nil {
  id := mapid.(bson.ObjectId)
  document_id = id.Hex()
 }
}

注意:若是查找username含有”impressionw”的文檔,可用正則匹配查找,條件這樣寫:

query = bson.M{"username": bson.M{"$regex": "impressionw"}}

4、查詢數(shù)組中匹配元素,只返回含有匹配元素的文檔,需要用到Mongdob的聚合aggregate

    相關操作符的含義如下:

  • $project:修改輸入文檔的結構??梢杂脕碇孛⒃黾踊騽h除域,也可以用于創(chuàng)建計算結果以及嵌套文檔。
  • match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。match使用MongoDB的標準查詢操作。
  • $limit:用來限制MongoDB聚合管道返回的文檔數(shù)。
  • $skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔。
  • $unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值。
  • $group:將集合中的文檔分組,可用于統(tǒng)計結果。
  • $sort:將輸入文檔排序后輸出。
  • $geoNear:輸出接近某一地理位置的有序文檔。

下面的代碼,將只返回FavorateBooks字段中,bookname為”The Go Programming Language”的書籍,且只關注favoratebooks,不會輸出個人信息

pipe := c.Pipe([]bson.M{{"$unwind": "$favoratebooks"},
  {"$match": bson.M{"username": "impressionw", "favoratebooks.bookname": "The Go Programming Language"}},
  {"$project": bson.M{"favoratebooks": 1}}})
resp := []bson.M{}
err := pipe.All(&resp)

這樣可以達到目的了

更新文檔

1、更新WhereCity字段—關鍵字 $set,將WhereCity修改為”ShangHai“:

err = c.Update(bson.M
{"username": "impressionw"
}, 
bson.M{"$set": bson.M
{"wherecity": "ShangHai"
}})

2、更新FavoriteBooks中的LastReadTime字段

   查詢條件:username=”impressionw”、bookname=”The Go Programming Language”,將LastReadTime字段更改為:”O(jiān)ct 26, 2017”

change := mgo.Change{
  Update: bson.M{"$set": bson.M{"favoratebooks.$.lastreadtime": "Oct 26, 2017"}},
  ReturnNew: false,
  Remove: false,
  Upsert: true,
 }
query := bson.M{"username": "impressionw", "favoratebooks": bson.M{"$elemMatch": bson.M{"bookname": "The Go Programming Language"}}}
_, err = c.Find(query).Select(bson.M{"favoratebooks.bookname": 1}).Apply(change, nil)

3、更新一個 FavoriteBooks 的整個數(shù)組文檔,即新增一本書的信息
      給username=”impressionw”的文檔新增一條書籍記錄,同時將BookSCount字段自增1

Act := []LikeBest{
 LikeBest{
  AuthorName: "YuHen",
  BookName:  "Go Learning",
  PublishTime: "Dec 27, 2014",
  LastReadTime: "Dec 29, 2016",
 },
}
change := mgo.Change{
 Update: bson.M{"$inc": bson.M{"bookscount": 1}, "$push": bson.M{"favoratebooks": bson.M{"$each": Act}}},
 ReturnNew: false,
 Remove: false,
 Upsert: true,
}
_, err := c.Find(bson.M{"username": "impressionw"}).Apply(change, nil)

注意:

1、此處可用addToSet代替push,addToSet不會添加已有的數(shù)據(jù),push 會添加重復的數(shù)據(jù),可以分別應用于不同場景
2、$inc 對文檔的某個值為數(shù)字型(只能為滿足要求的數(shù)字)的鍵進行增減的操作, 值為正數(shù)表示自增,值為負數(shù)表示自減

刪除文檔

1、刪除喜歡的一本書籍信息,同時喜歡書記數(shù)量自減1

var option = bson.M
{"$pull": bson.M{"favoratebooks": bson.M{"bookname": "Go Learning"}}, 
"$inc": bson.M{"bookscount": -1}}
err := c.Update(bson.M{"username": "impressionw"}, option)

2、刪除所有喜歡的書籍,同時將bookscount字段置為 0

var data = bson.M{"$unset": bson.M
{"favoratebooks": true},
 "$set": bson.M{"bookscount": 0}}
err = c.Update(bson.M
{"username": "impressionw"}, data)

3、刪除整個文檔,根據(jù)”_id”字段刪除文檔

err := session.DB("PersonManage").C("Persons").Remove(bson.M
{"_id":bson.ObjectIdHex("

到此這篇關于詳解Golang使用MongoDB通用操作的文章就介紹到這了,更多相關Golang使用MongoDB通用操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言學習之映射(map)的用法詳解

    Go語言學習之映射(map)的用法詳解

    Map是一種無序的鍵值對的集合。這篇文章主要為大家詳細介紹了Go語言中映射的用法,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-04-04
  • 詳解go如何優(yōu)雅的使用接口與繼承

    詳解go如何優(yōu)雅的使用接口與繼承

    Go語言中的接口和嵌套結構體是兩種重要的代碼設計方式,接口定義了一組方法簽名,使得不同的類型能夠以相同的方式進行交互,本文將給大家介紹go語言如何優(yōu)雅的使用接口與繼承,文中有詳細的代碼供大家參考,需要的朋友可以參考下
    2024-06-06
  • golang簡易令牌桶算法實現(xiàn)代碼

    golang簡易令牌桶算法實現(xiàn)代碼

    這篇文章主要介紹了golang簡易令牌桶算法實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • golang自帶的死鎖檢測并非銀彈的問題小結

    golang自帶的死鎖檢測并非銀彈的問題小結

    Go語言自帶的死鎖檢測機制并不萬能,它只對用戶創(chuàng)建的協(xié)程進行檢測,并且在特定條件下可能會“失靈”,死鎖檢測的觸發(fā)時機和檢測內容也有限制,因此不能完全避免死鎖問題,為了預防死鎖,應該在編寫代碼時提前進行設計和測試,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • golang validator參數(shù)校驗的實現(xiàn)

    golang validator參數(shù)校驗的實現(xiàn)

    這篇文章主要介紹了golang validator參數(shù)校驗的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • golang占位符%v、%+v、%#v舉例詳解

    golang占位符%v、%+v、%#v舉例詳解

    這篇文章主要給大家介紹了關于golang占位符%v、%+v、%#v的相關資料,Go語言中的占位符通常用于格式化輸出,它們以%開頭,后跟一個字符,表示要轉換的數(shù)據(jù)類型,需要的朋友可以參考下
    2024-05-05
  • Go語言中并發(fā)的工作原理

    Go語言中并發(fā)的工作原理

    本文詳細講解了Go語言中并發(fā)的工作原理,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 詳解Golang net/http包中的RoundTripper接口

    詳解Golang net/http包中的RoundTripper接口

    RoundTripper 是 net/http 包中的一個接口,定義了處理 HTTP 請求返回和響應的方法,是 http.Client 結構體中執(zhí)行 http 請求的核心部分,本文將詳細的給大家介紹Golang RoundTripper接口,需要的朋友可以參考下
    2023-09-09
  • 詳解如何使用Golang擴展Envoy

    詳解如何使用Golang擴展Envoy

    這篇文章主要為大家介紹了詳解如何使用Golang擴展Envoy實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 使用Golang的singleflight防止緩存擊穿的方法

    使用Golang的singleflight防止緩存擊穿的方法

    這篇文章主要介紹了使用Golang的singleflight防止緩存擊穿的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04

最新評論

辰溪县| 丽江市| 秦安县| 淄博市| 普兰县| 繁峙县| 海安县| 龙南县| 慈利县| 仁化县| 昭平县| 马山县| 津市市| 衡阳市| 邵东县| 杭锦旗| 化德县| 贵阳市| 万山特区| 邮箱| 遵化市| 西青区| 新晃| 黔江区| 乐昌市| 通辽市| 平乐县| 修武县| 乌海市| 井研县| 无为县| 廊坊市| 天柱县| 临海市| 宁城县| 霞浦县| 雷山县| 包头市| 汶上县| 凌云县| 托克逊县|