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

Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝教程

 更新時間:2018年07月05日 10:53:01   作者:CodeMiner  
mongodb官方?jīng)]有關(guān)于go的mongodb的驅(qū)動,因此只能使用第三方驅(qū)動,mgo就是使用最多的一種。下面這篇文章主要給大家介紹了關(guān)于利用Golang對MongoDB數(shù)據(jù)庫的操作簡單封裝的相關(guān)資料,需要的朋友可以參考下

前言

Golang 對MongoDB的操作簡單封裝

使用MongoDB的Go驅(qū)動庫 mgo,對MongoDB的操作做一下簡單封裝

mgo(音mango)是MongoDB的Go語言驅(qū)動,它用基于Go語法的簡單API實現(xiàn)了豐富的特性,并經(jīng)過良好測試。

初始化

操作沒有用戶權(quán)限的MongoDB

var globalS *mgo.Session

func init() {
 s, err := mgo.Dial(dialInfo)
 if err != nil {
 log.Fatalf("Create Session: %s\n", err)
 }
 globalS = s
}

如果MongoDB設(shè)置了用戶權(quán)限需要使用下面的方法操作

func init() {
 dialInfo := &mgo.DialInfo{
 Addrs: []string{dbhost}, //數(shù)據(jù)庫地址 dbhost: mongodb://user@123456:127.0.0.1:27017
 Timeout: timeout,  // 連接超時時間 timeout: 60 * time.Second
 Source: authdb,  // 設(shè)置權(quán)限的數(shù)據(jù)庫 authdb: admin
 Username: authuser,  // 設(shè)置的用戶名 authuser: user
 Password: authpass, // 設(shè)置的密碼 authpass: 123456
 PoolLimit: poollimit, // 連接池的數(shù)量 poollimit: 100
 }

 s, err := mgo.DialWithInfo(dialInfo)
 if err != nil {
 log.Fatalf("Create Session: %s\n", err)
 }
 globalS = s
}

連接具體的數(shù)據(jù)和文檔

每一次操作都copy一份 Session,避免每次創(chuàng)建Session,導(dǎo)致連接數(shù)量超過設(shè)置的最大值

獲取文檔對象 c := Session.DB(db).C(collection)

func connect(db, collection string) (*mgo.Session, *mgo.Collection) {
 ms := globalS.Copy()
 c := ms.DB(db).C(collection)
 ms.SetMode(mgo.Monotonic, true)
 return ms, c
}

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

每次操作之后都要主動關(guān)閉 Session defer Session.Close()

db:操作的數(shù)據(jù)庫

collection:操作的文檔(表)

doc:要插入的數(shù)據(jù)

func Insert(db, collection string, doc interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 return c.Insert(doc)
}

// test
data := &Data{
 Id: bson.NewObjectId().Hex(),
 Title: "標(biāo)題",
 Des: "博客描述信息",
 Content: "博客的內(nèi)容信息",
 Img: "https://upload-images.jianshu.io/upload_images/8679037-67456031925afca6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700",
 Date: time.Now(),
}

err := db.Insert("Test", "TestModel", data)

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

db:操作的數(shù)據(jù)庫

collection:操作的文檔(表)

query:查詢條件

selector:需要過濾的數(shù)據(jù)(projection)

result:查詢到的結(jié)果

func FindOne(db, collection string, query, selector, result interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 return c.Find(query).Select(selector).One(result)
}

func FindAll(db, collection string, query, selector, result interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 return c.Find(query).Select(selector).All(result)
}

//test 查詢title="標(biāo)題",并且返回結(jié)果中去除`_id`字段
var result Data
err = db.FindOne(database, collection, bson.M{"title": "標(biāo)題"}, bson.M{"_id":0}, &result)

更新數(shù)據(jù)

db:操作的數(shù)據(jù)庫

collection:操作的文檔(表)

selector:更新條件

update:更新的操作

func Update(db, collection string, selector, update interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 return c.Update(selector, update)
}

//更新,如果不存在就插入一個新的數(shù)據(jù) `upsert:true`
func Upsert(db, collection string, selector, update interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 _, err := c.Upsert(selector, update)
 return err
}

// `multi:true`
func UpdateAll(db, collection string, selector, update interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 _, err := c.UpdateAll(selector, update)
 return err
}

//test
err = db.Update(database, collection, bson.M{"_id": "5b3c30639d5e3e24b8786540"}, bson.M{"$set": bson.M{"title": "更新標(biāo)題"}})

刪除數(shù)據(jù)

db:操作的數(shù)據(jù)庫

collection:操作的文檔(表)

selector:刪除條件

func Remove(db, collection string, selector interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 return c.Remove(selector)
}

func RemoveAll(db, collection string, selector interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 _, err := c.RemoveAll(selector)
 return err
}

//test
err = db.Remove(database,collection,bson.M{"_id":"5b3c30639d5e3e24b8786540"})

分頁查詢

db:操作的數(shù)據(jù)庫

collection:操作的文檔(表)

page:當(dāng)前頁面

limit:每頁的數(shù)量值

query:查詢條件

selector:需要過濾的數(shù)據(jù)(projection)

result:查詢到的結(jié)果

func FindPage(db, collection string, page, limit int, query, selector, result interface{}) error {
 ms, c := connect(db, collection)
 defer ms.Close()

 return c.Find(query).Select(selector).Skip(page * limit).Limit(limit).All(result)
}

其他操作

func IsEmpty(db, collection string) bool {
 ms, c := connect(db, collection)
 defer ms.Close()
 count, err := c.Count()
 if err != nil {
 log.Fatal(err)
 }
 return count == 0
}

func Count(db, collection string, query interface{}) (int, error) {
 ms, c := connect(db, collection)
 defer ms.Close()
 return c.Find(query).Count()
}

完整的代碼請參考 (本地下載

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Golang Map簡介以及底層原理

    Golang Map簡介以及底層原理

    這篇文章主要介紹了Golang Map簡介以及底層原理的相關(guān)資料,Go語言提供的map是一種鍵值對存儲結(jié)構(gòu),支持基本操作如len、delete等,map是非線程安全的,可用sync.Mutex確保并發(fā)安全,為高效查找和插入,需要的朋友可以參考下
    2024-10-10
  • 精選Golang高頻面試題和答案分享

    精選Golang高頻面試題和答案分享

    這篇文章給大家整理了17道Go語言中的高頻面試題和答案詳解,每道題都給出了代碼示例,方便大家更好的理解,需要的小伙伴可以收藏一下
    2023-06-06
  • golang之?dāng)?shù)組切片的具體用法

    golang之?dāng)?shù)組切片的具體用法

    本文主要介紹了golang之?dāng)?shù)組切片的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 詳解如何利用GORM實現(xiàn)MySQL事務(wù)

    詳解如何利用GORM實現(xiàn)MySQL事務(wù)

    為了確保數(shù)據(jù)一致性,在項目中會經(jīng)常用到事務(wù)處理,對于MySQL事務(wù)相信大家應(yīng)該都不陌生。這篇文章主要總結(jié)一下在Go語言中Gorm是如何實現(xiàn)事務(wù)的;感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-09-09
  • golang 之import和package的使用

    golang 之import和package的使用

    這篇文章主要介紹了golang 之import和package的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 深入了解Go的interface{}底層原理實現(xiàn)

    深入了解Go的interface{}底層原理實現(xiàn)

    本文主要介紹了Go的interface{}底層原理實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go語言開發(fā)區(qū)塊鏈只需180行代碼(推薦)

    Go語言開發(fā)區(qū)塊鏈只需180行代碼(推薦)

    這篇文章主要介紹了Go語言開發(fā)區(qū)塊鏈只需180行代碼,文章中將不會涉及工作量證明算法(PoW)以及權(quán)益證明算法(PoS)這類的共識算法。需要的朋友可以參考下
    2018-05-05
  • gorm+gin實現(xiàn)restful分頁接口的實踐

    gorm+gin實現(xiàn)restful分頁接口的實踐

    本文主要介紹了gorm+gin實現(xiàn)restful分頁接口的實踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • goland最新激活辦法

    goland最新激活辦法

    這篇文章主要介紹了goland最新激活辦法,激活方法真的超級簡單,只需要把腳本內(nèi)容復(fù)制到對應(yīng)文件,并運行該腳本就可以了,需要的朋友可以參考下
    2021-12-12
  • Go模板后端渲染時vue單頁面沖突

    Go模板后端渲染時vue單頁面沖突

    go后端模版語法是通過 {{}} ,vue也是通過雙花括號來渲染的,如果使用go渲染vue的html頁面的時候就會報錯,本文主要介紹了Go模板后端渲染時vue單頁面沖突,感興趣的可以了解一下
    2024-01-01

最新評論