使用go在mangodb中進(jìn)行CRUD操作
我在學(xué)習(xí)go語(yǔ)言之前,在對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD的操作基本是用java和sql來(lái)對(duì)mysql數(shù)據(jù)庫(kù)進(jìn)行操作,但是到了實(shí)習(xí)中公司業(yè)務(wù)都是用的是mangodb,通過(guò)一段學(xué)習(xí)時(shí)間后,我有了一些收獲。
簡(jiǎn)述關(guān)系型數(shù)據(jù)庫(kù),非關(guān)系型數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù):指采用了關(guān)系模型來(lái)組織數(shù)據(jù)的數(shù)據(jù)庫(kù)。
關(guān)系模型指的就是二維表格模型,而一個(gè)關(guān)系型數(shù)據(jù)庫(kù)就是由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織
非關(guān)系型數(shù)據(jù)庫(kù)
非關(guān)系型數(shù)據(jù)庫(kù):指非關(guān)系型的,分布式的,且一般不保證遵循 ACID 原則的數(shù)據(jù)存儲(chǔ)系統(tǒng)。
這是比較規(guī)范的說(shuō)法,具體這兩者談不上誰(shuí)優(yōu)誰(shuí)劣,各自有各自的使用場(chǎng)景。
其實(shí)可以粗暴的理解成一個(gè)關(guān)系型數(shù)據(jù)庫(kù)基本靠使用sql語(yǔ)句來(lái)操作,而非關(guān)系型數(shù)據(jù)靠key-value來(lái)進(jìn)行操作
(其實(shí)按我的理解非關(guān)系型數(shù)據(jù)庫(kù)嚴(yán)格上不是一種數(shù)據(jù)庫(kù),應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)方法的集合,可以是文檔或者鍵值對(duì)等,但是我不知道這么說(shuō)是否正確)
MangoDB
好了,上面簡(jiǎn)述了一下關(guān)系型和非關(guān)系型數(shù)據(jù)庫(kù),下面來(lái)說(shuō)一下今天文章的主角。
mangodb
MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類(lèi)似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
所以mangodb操作也是通過(guò)json(bson)格式來(lái)操作
那么go語(yǔ)言中是如何來(lái)操作mangodb
(1)數(shù)據(jù)庫(kù)連接
數(shù)據(jù)庫(kù)連接主要用到了mgo中的Dial()函數(shù),連接形式如mgo.Dial(url1,url2,url3),具體代碼如下:
func ConnecToDB() *mgo.Collection { session, err := mgo.Dial("127.0.0.1:27017") if err != nil { panic(err) } //defer session.Close() session.SetMode(mgo.Monotonic, true) c := session.DB("medex").C("student") return c }
(2)插入
func InsertToMogo() { c := ConnecToDB() stu1 := Student{ Name: "xiaoming", Phone: "18933333333", Email: "12345678@qq.com", Sex: "man", } stu2 := Student{ Name: "zhangdao", Phone: "8765432", Email: "133333384@qq.com", Sex: "woman", } err := c.Insert(&stu1, &stu2) if err != nil { log.Fatal(err) } }
(3)查詢(xún)
func GetDataViaSex() { c := ConnecToDB() result := Student{} err := c.Find(bson.M{"sex": "woman"}).One(&result) if err != nil { log.Fatal(err) } fmt.Println("student", result) students := make([]Student, 20) err = c.Find(nil).All(&students) if err != nil { log.Fatal(err) } fmt.Println(students) } func GetDataViaId() { id := bson.ObjectIdHex("5a66a96306d2a40a8b884049") c := ConnecToDB() stu := &Student{} err := c.FindId(id).One(stu) if err != nil { log.Fatal(err) } fmt.Println(stu) }
這上面用了兩種查詢(xún)方法一種是查詢(xún)多個(gè),返回多個(gè)對(duì)象:many
另一種是查詢(xún)單個(gè),返回單個(gè)對(duì)象:one
(4)更新
func UpdateDBViaId() { //id := bson.ObjectIdHex("5a66a96306d2a40a8b884049") c := ConnecToDB() err := c.Update(bson.M{"email": "12832984@qq.com"}, bson.M{"$set": bson.M{"name": "haha", "phone": "37848"}}) if err != nil { log.Fatal(err) } }
(5)刪除
func RemoveFromMgo() { c := ConnecToDB() _, err := c.RemoveAll(bson.M{"phone": "13480989765"}) if err != nil { log.Fatal(err) } }
總結(jié)
以上所述是小編給大家介紹的使用go在mangodb中進(jìn)行CRUD操作,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
使用Go重構(gòu)流式日志網(wǎng)關(guān)的實(shí)戰(zhàn)分享
流式日志網(wǎng)關(guān)的主要功能是提供?HTTP?接口,接收?CDN?邊緣節(jié)點(diǎn)上報(bào)的各類(lèi)日志(訪(fǎng)問(wèn)日志/報(bào)錯(cuò)日志/計(jì)費(fèi)日志等),將日志作預(yù)處理并分流到多個(gè)的?Kafka?集群和?Topic?中,本文就給大家分享如何使用?Go?重構(gòu)流式日志網(wǎng)關(guān)2023-06-06再次探討go實(shí)現(xiàn)無(wú)限 buffer 的 channel方法
我們知道go語(yǔ)言?xún)?nèi)置的channel緩沖大小是有上限的,那么我們自己如何實(shí)現(xiàn)一個(gè)無(wú)限 buffer 的 channel呢?今天通過(guò)本文給大家分享go實(shí)現(xiàn)無(wú)限 buffer 的 channel方法,感興趣的朋友一起看看吧2021-06-06Golang內(nèi)存模型教科書(shū)級(jí)講解
go官方介紹go內(nèi)存模型的時(shí)候說(shuō):探究在什么條件下,goroutine?在讀取一個(gè)變量的值的時(shí),能夠看到其它?goroutine?對(duì)這個(gè)變量進(jìn)行的寫(xiě)的結(jié)果,Go內(nèi)存模型規(guī)定了一些條件,在這些條件下,在一個(gè)goroutine中讀取變量返回的值能夠確保是另一個(gè)goroutine中對(duì)該變量寫(xiě)入的值2023-03-03golang實(shí)現(xiàn)微信支付v3版本的方法
這篇文章主要介紹了golang實(shí)現(xiàn)微信支付v3版本的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03