我在學(xué)習(xí)go語言之前,在對數(shù)據(jù)庫進(jìn)行CRUD的操作基本是用java和sql來對mysql數(shù)據(jù)庫進(jìn)行操作,但是到了實(shí)習(xí)中公司業(yè)務(wù)都是用的是mangodb,通過一段學(xué)習(xí)時(shí)間后,我有了一些收獲。
簡述關(guān)系型數(shù)據(jù)庫,非關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫:指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫。
關(guān)系模型指的就是二維表格模型,而一個(gè)關(guān)系型數(shù)據(jù)庫就是由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織
非關(guān)系型數(shù)據(jù)庫
非關(guān)系型數(shù)據(jù)庫:指非關(guān)系型的,分布式的,且一般不保證遵循 ACID 原則的數(shù)據(jù)存儲系統(tǒng)。
這是比較規(guī)范的說法,具體這兩者談不上誰優(yōu)誰劣,各自有各自的使用場景。
其實(shí)可以粗暴的理解成一個(gè)關(guān)系型數(shù)據(jù)庫基本靠使用sql語句來操作,而非關(guān)系型數(shù)據(jù)靠key-value來進(jìn)行操作
(其實(shí)按我的理解非關(guān)系型數(shù)據(jù)庫嚴(yán)格上不是一種數(shù)據(jù)庫,應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲方法的集合,可以是文檔或者鍵值對等,但是我不知道這么說是否正確)
MangoDB
好了,上面簡述了一下關(guān)系型和非關(guān)系型數(shù)據(jù)庫,下面來說一下今天文章的主角。
mangodb
MongoDB 將數(shù)據(jù)存儲為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
所以mangodb操作也是通過json(bson)格式來操作
那么go語言中是如何來操作mangodb
(1)數(shù)據(jù)庫連接
數(shù)據(jù)庫連接主要用到了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)查詢
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)
}
這上面用了兩種查詢方法一種是查詢多個(gè),返回多個(gè)對象:many
另一種是查詢單個(gè),返回單個(gè)對象: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操作,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!