這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
go沒有類這一概念,對於變數的捆綁都是由索引值對形式的結構體(struct)實現的。
這對同樣是以索引值對形式儲存的mongodb以及json都非常友好。所以在go中,並不是很依賴建立在mongodb之上的orm,使用比較底層的驅動級的介面即可方便的進行操作。
本篇文章將以商品(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。但是這樣的結構在與json做互動時不是很方便。
在做記錄的查詢時,需要建立一個同類型的結構體或結構體數組,然後執行Find操作,如果參數為空白,則返回全部記錄:
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內操作幾乎相同。
刪除:
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)}