欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Golang使用MongoDB通用操作

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

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

       研究的事例結(jié)構(gòu)如下:

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")

注意:以下操作條件默認(rèn)均為:username=”impressionw”

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

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

err := c.Insert(&p) //p為插入的結(jié)構(gòu)體數(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)

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

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

查詢(xún)數(shù)據(jù)

1、查詢(xún)整個(gè)文檔

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

2、只返回 FavoriteBooks 對(duì)應(yīng)的字段,忽略其他信息
    這里用到了Select(),select可以設(shè)置,返回的內(nèi)容:

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

3、查詢(xún)文檔的_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”的文檔,可用正則匹配查找,條件這樣寫(xiě):

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

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

    相關(guān)操作符的含義如下:

  • $project:修改輸入文檔的結(jié)構(gòu)??梢杂脕?lái)重命名、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔。
  • match:用于過(guò)濾數(shù)據(jù),只輸出符合條件的文檔。match使用MongoDB的標(biāo)準(zhǔn)查詢(xún)操作。
  • $limit:用來(lái)限制MongoDB聚合管道返回的文檔數(shù)。
  • $skip:在聚合管道中跳過(guò)指定數(shù)量的文檔,并返回余下的文檔。
  • $unwind:將文檔中的某一個(gè)數(shù)組類(lèi)型字段拆分成多條,每條包含數(shù)組中的一個(gè)值。
  • $group:將集合中的文檔分組,可用于統(tǒng)計(jì)結(jié)果。
  • $sort:將輸入文檔排序后輸出。
  • $geoNear:輸出接近某一地理位置的有序文檔。

下面的代碼,將只返回FavorateBooks字段中,bookname為”The Go Programming Language”的書(shū)籍,且只關(guān)注favoratebooks,不會(huì)輸出個(gè)人信息

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)

這樣可以達(dá)到目的了

更新文檔

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

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

2、更新FavoriteBooks中的LastReadTime字段

   查詢(xún)條件: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、更新一個(gè) FavoriteBooks 的整個(gè)數(shù)組文檔,即新增一本書(shū)的信息
      給username=”impressionw”的文檔新增一條書(shū)籍記錄,同時(shí)將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不會(huì)添加已有的數(shù)據(jù),push 會(huì)添加重復(fù)的數(shù)據(jù),可以分別應(yīng)用于不同場(chǎng)景
2、$inc 對(duì)文檔的某個(gè)值為數(shù)字型(只能為滿(mǎn)足要求的數(shù)字)的鍵進(jìn)行增減的操作, 值為正數(shù)表示自增,值為負(fù)數(shù)表示自減

刪除文檔

1、刪除喜歡的一本書(shū)籍信息,同時(shí)喜歡書(shū)記數(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、刪除所有喜歡的書(shū)籍,同時(shí)將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、刪除整個(gè)文檔,根據(jù)”_id”字段刪除文檔

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

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

相關(guān)文章

  • Go語(yǔ)言Time包的具體使用

    Go語(yǔ)言Time包的具體使用

    Go語(yǔ)言中有關(guān)于時(shí)間和日期的方法都在time包里面,本文主要介紹了Go語(yǔ)言Time包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 如何在Go中將[]byte轉(zhuǎn)換為io.Reader

    如何在Go中將[]byte轉(zhuǎn)換為io.Reader

    本文主要介紹了如何在Go中將[]byte轉(zhuǎn)換為io.Reader,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語(yǔ)言的IO庫(kù)那么多糾結(jié)該如何選擇

    Go語(yǔ)言的IO庫(kù)那么多糾結(jié)該如何選擇

    在Go語(yǔ)言中涉及 I/O 操作的內(nèi)置庫(kù)有很多種,比如: io 庫(kù), os 庫(kù), ioutil 庫(kù), bufio 庫(kù), bytes 庫(kù), strings 庫(kù)等等。擁有這么多內(nèi)置庫(kù)是好事,但是具體到涉及 I/O 的場(chǎng)景我們應(yīng)該選擇哪個(gè)庫(kù)呢,帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧
    2021-06-06
  • Goland?Gin?框架中的表單處理與數(shù)據(jù)綁定的操作方法

    Goland?Gin?框架中的表單處理與數(shù)據(jù)綁定的操作方法

    本文詳細(xì)介紹了Gin框架中表單處理的功能,包括數(shù)據(jù)綁定、驗(yàn)證和文件上傳等,并通過(guò)一個(gè)完整的用戶(hù)注冊(cè)項(xiàng)目示例展示了實(shí)際應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Goland的設(shè)置與配置全過(guò)程

    Goland的設(shè)置與配置全過(guò)程

    這篇文章主要介紹了Goland的設(shè)置與配置全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Go語(yǔ)言的GOPATH與工作目錄詳解

    Go語(yǔ)言的GOPATH與工作目錄詳解

    這篇文章主要介紹了Go語(yǔ)言的GOPATH與工作目錄詳解,本文詳細(xì)講解了GOPATH設(shè)置、應(yīng)用目錄結(jié)構(gòu)、編譯應(yīng)用等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 一文搞懂Golang 時(shí)間和日期相關(guān)函數(shù)

    一文搞懂Golang 時(shí)間和日期相關(guān)函數(shù)

    這篇文章主要介紹了Golang 時(shí)間和日期相關(guān)函數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 深入淺析Go中三個(gè)點(diǎn)(...)用法

    深入淺析Go中三個(gè)點(diǎn)(...)用法

    這篇文章主要介紹了深入淺析Go中三個(gè)點(diǎn)(...)用法,需要的朋友可以參考下
    2021-10-10
  • Go語(yǔ)言實(shí)現(xiàn)并發(fā)控制的常見(jiàn)方式詳解

    Go語(yǔ)言實(shí)現(xiàn)并發(fā)控制的常見(jiàn)方式詳解

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)并發(fā)控制的幾種常見(jiàn)方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-03-03
  • golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法詳解

    golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法詳解

    常見(jiàn)的IO模型有阻塞、非阻塞、IO多路復(fù)用,異,下面這篇文章主要給大家介紹了關(guān)于golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評(píng)論