1. 程式人生 > >golang mongoDB 的集合建立以及增刪改查操作

golang mongoDB 的集合建立以及增刪改查操作

mongo官方沒有golang 的官方驅動,但是有一個社群驅動:
http://labix.org/mgo
api文件:https://godoc.org/gopkg.in/mgo.v2#Collection.Update
資料的連線操作請看的我的上一篇部落格,本文重點介紹mgo的CURD操作及遇到的坑。
mog的文件可以不用特別的建立,在資料插入的時候,如果驅動發現文件不存在,會自動建立。
連線操作

type Operater struct {
    mogSession *mgo.Session
    dbname string
    document string
}
//集合的結構 其他中AGE NAME HEIGHT 名字的首字母必須大寫,如果不無法訪問到
type person struct { AGE int NAME string HEIGHT int } //連線資料庫 func (operater *Operater) connect() error { mogsession, err := mgo.Dial(url) if err != nil { fmt.Println(err) return err } operater.mogSession=mogsession return nil }

插入操作

//插入
func (operater *Operater) insert( p *person) error {
    collcetion:=operater.mogSession
.DB(operater.dbname).C(operater.document) err:=collcetion.Insert(p) return err }

使用方式

p:=person{
        33,
        "周杰倫",
        175,
    }
    err=op.insert(&p)
    if err != nil {
        fmt.Println("插入出錯",err)
    }

更新操作,呼叫一次更新操作都是更新一行的。

//更新一行
func (operater *Operater) update() (error) {
    collcetion:=operater.mogSession
.DB(operater.dbname).C(operater.document) update:=person{ 33, "詹姆斯", 201, } err:=collcetion.Update(bson.M{"name": "周杰倫"},update) if err !=nil { fmt.Println(err) } return err }

如果想更新所有可以使用UpdateAll() 方法。

查詢操作

//統計集合中資料的個數
func (operater *Operater) query() ([]person,error) {
    collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
    p:=new(person)
    p.AGE=33
    query:=collcetion.Find(nil)
    ps:=[]person{}
    query.All(&ps)
    iter:=collcetion.Find(nil).Iter()
    //單個查詢
    result:=new(person)
    for iter.Next(&result) {
        fmt.Println("一個一個輸出:", result)
    }
    return ps,nil
}

查詢的引數可以是一個map或一個能夠被bson編碼的結構體。
該map的key和value可以是一般的interface{},例如bson.M。nil,相當於提供一個空document,如bson.m {}.

查詢的結果展示有四個方法:One, For, Iter, or Tail

按照條件查詢

func (operater *Operater) query() ([]person,error) {
    collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
    p:=new(person)
    p.AGE=33
    query:=collcetion.Find(bson.M{"age":21})
    ps:=[]person{}
    query.All(&ps)
    fmt.Println(ps)
    return ps,nil
}

上述方法會查詢age =21 的結果集。
查詢條件有一個bson ,什麼是bson ??

裡面有一個bson 的資料結構,bson 其實就是 Binary Serialized Document Format 二進位制檔案儲存格式,類似於JSON,它和JSON一樣,支援內嵌的文件物件和陣列物件。
BSON可以做為網路資料交換的一種儲存形式,這個有點類似於Google的Protocol Buffer,但是BSON是一種schema-less的儲存形式,它的優點是靈活性高,但它的缺點是空間利用率不是很理想,
BSON有三個特點:輕量性、可遍歷性、高效性。
MongoDB把BSON做為其資料的儲存結構。為啥呢,一個重要的原因是BSON 可遍歷。

條件查詢帶表示式

//條件查詢
func (operater *Operater) query() ([]person,error) {
    collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
    p:=new(person)
    p.AGE=33
    query:=collcetion.Find(bson.M{"age":bson.M{"$eq":21}})
    ps:=[]person{}
    query.All(&ps)
    fmt.Println(ps)
    return ps,nil
}

刪除操作

//單行刪除
func (operater *Operater) delete(seletor interface{}) (error) {
    collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
    return collcetion.Remove(seletor)
}
刪除方法用法
err=op.delete(&bson.M{"height": 0})
    if err!=nil {
        fmt.Println("刪除錯誤",err)
    }else{
        fmt.Println("刪除成功")
    }

資料結構體的定義,其中AGE NAME HEIGHT 名字的首字母必須大寫,如果不無法與資料庫欄位名相對應。

type person struct {
    AGE    int
    NAME   string
    HEIGHT int
}

如果名稱不一致的解決方式

type person struct { 
    AGE    int  `bson:"age"`
    NAME   string `bson:"name"`
    HEIGHT int    `bson:"height"`
}

這一點很類似於orm的感覺