我在學習go語言以前,在對數據庫進行CRUD的操做基本是用java和sql來對mysql數據庫進行操做,可是到了實習中公司業務都是用的是mongodb,經過一段學習時間後,我有了一些收穫。
關係型數據庫:指採用了關係模型來組織數據的數據庫。
關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織
java
非關係型數據庫:指非關係型的,分佈式的,且通常不保證遵循ACID
原則的數據存儲系統。mysql
這是比較規範的說法,具體這二者談不上誰優誰劣,各自有各自的使用場景。sql
其實能夠粗暴的理解成一個關係型數據庫基本靠使用sql語句來操做,而非關係型數據靠key-value來進行操做mongodb
(其實按個人理解非關係型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合,能夠是文檔或者鍵值對等,可是我不知道這麼說是否正確)
數據庫
好了,上面簡述了一下關係型和非關係型數據庫,下面來講一下今天文章的主角。json
mongodb數組
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。
bash
因此mongodb操做也是經過json(bson)格式來操做session
那麼go語言中是如何來操做mongodb數據結構
數據庫鏈接主要用到了mgo中的Dial()函數,鏈接形式如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
}複製代碼
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)
}
}複製代碼
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)
}複製代碼
這上面用了兩種查詢方法一種是查詢多個,返回多個對象:many
另外一種是查詢單個,返回單個對象:one
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)
}
}複製代碼
func RemoveFromMgo() {
c := ConnecToDB()
_, err := c.RemoveAll(bson.M{"phone": "13480989765"})
if err != nil {
log.Fatal(err)
}
}複製代碼