go沒有類這一概念,對于變量的捆綁都是由鍵值對形式的結(jié)構(gòu)體(struct)實現(xiàn)的快骗。
這對同樣是以鍵值對形式存儲的mongodb以及json都非常友好娜庇。所以在go中,并不是很依賴建立在mongodb之上的orm方篮,使用比較底層的驅(qū)動級的接口即可方便的進行操作名秀。
本篇文章將以商品(goods)為例,簡單講解如何使用mgo進行簡單的增刪改查操作藕溅。
mgo
mgo (pronounced as mango) is a MongoDB driver for the Go language that implements a rich and well tested selection of features under a very simple API following standard Go idioms.
打開終端輸入
go get gopkg.in/mgo.v2
在當前pkg下新建goods.go文件, 對mgo提供的接口進行一些封裝:
func connect(cName string) (*mgo.Session, *mgo.Collection) {
session, err := mgo.Dial("$mongoHost") //Mongodb's connection
if err != nil {
panic(err)
}
session.SetMode(mgo.Monotonic, true)
//return a instantiated collect
return session, session.DB(mongoDB).C(cName)
}
定義goods實例:
type Goods struct {
ID string
Name string
Price string
Url string
}
接下來我們要存入第一條記錄:
func (a *Goods) save() error {
s, c := connect("goods")
defer s.Close()
a.ID = bson.NewObjectId().Hex()
return c.Insert(&a)
}
特別注意: 如果在定義時將ID的類型定義為 bson.ObjectID
匕得,并指定bson標簽為_id
,mongodb將不會為它分配新的id巾表。但是這樣的結(jié)構(gòu)在與json做交互時不是很方便汁掠。
在做記錄的查詢時,需要新建一個同類型的結(jié)構(gòu)體或結(jié)構(gòu)體數(shù)組攒发,然后執(zhí)行Find
操作调塌,如果參數(shù)為空晋南,則返回全部記錄:
func (a Goods) all() ([]Goods, error) {
s, c := connect("goods")
defer s.Close()
var group []Goods
err := c.Find(nil).All(&group)
return group, err
}
func (a *Goods) get(id string) error {
s, c := connect("goods")
defer s.Close()
return c.Find(bson.M{"id": id}).One(&a)
}
如果你熟悉mongodb的操作惠猿,可以看出,這樣的操作與直接在shell內(nèi)操作幾乎相同负间。
刪除:
func (a Goods) delete() error {
s, c := connect("goods")
defer s.Close()
return c.Remove(bson.M{"id": a.ID})
}
更新:
func (a *Goods) update() error {
s, c := connect("goods")
defer s.Close()
c.Update(bson.M{"id": a.ID}, a)
return a.get(a.ID)
}