這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
mgo簡介
mongodb官方沒有關於go的mongodb的驅動,因此只能使用第三方驅動,mgo就是使用最多的一種。
mgo(音mango)是MongoDB的Go語言驅動,它用基於Go文法的簡單API實現了豐富的特性,並經過良好測試。
官網:http://labix.org/mgo
文檔:http://godoc.org/gopkg.in/mgo.v2
安裝與使用
安裝
go get gopkg.in/mgo.v2
go中使用
package mainimport ("gopkg.in/mgo.v2""gopkg.in/mgo.v2/bson")type Person struct {Id bson.ObjectId `bson:"_id"`Name string `bson:"tname"` //bson:"name" 表示mongodb資料庫中對應的欄位名稱Phone string `bson:"tphone"`}const URL = "192.168.1.43:50000" //mongodb連接字串var (mgoSession *mgo.SessiondataBase = "mydb")/** * 公用方法,擷取session,如果存在則拷貝一份 */func getSession() *mgo.Session {if mgoSession == nil {var err errormgoSession, err = mgo.Dial(URL)if err != nil {panic(err) //直接終止程式運行}}//最大串連池預設為4096return mgoSession.Clone()}//公用方法,擷取collection對象func witchCollection(collection string, s func(*mgo.Collection) error) error {session := getSession()defer session.Close()c := session.DB(dataBase).C(collection)return s(c)}/** * 添加person對象 */func AddPerson(p Person) string {p.Id = bson.NewObjectId()query := func(c *mgo.Collection) error {return c.Insert(p)}err := witchCollection("person", query)if err != nil {return "false"}return p.Id.Hex()}/** * 擷取一條記錄通過objectid */func GetPersonById(id string) *Person {objid := bson.ObjectIdHex(id)person := new(Person)query := func(c *mgo.Collection) error {return c.FindId(objid).One(&person)}witchCollection("person", query)return person}//擷取所有的person資料func PagePerson() []Person {var persons []Personquery := func(c *mgo.Collection) error {return c.Find(nil).All(&persons)}err := witchCollection("person", query)if err != nil {return persons}return persons}//更新person資料func UpdatePerson(query bson.M, change bson.M) string {exop := func(c *mgo.Collection) error {return c.Update(query, change)}err := witchCollection("person", exop)if err != nil {return "true"}return "false"}/** * 執行查詢,此方法可拆分做為公用方法 * [SearchPerson description] * @param {[type]} collectionName string [description] * @param {[type]} query bson.M [description] * @param {[type]} sort bson.M [description] * @param {[type]} fields bson.M [description] * @param {[type]} skip int [description] * @param {[type]} limit int) (results []interface{}, err error [description] */func SearchPerson(collectionName string, query bson.M, sort string, fields bson.M, skip int, limit int) (results []interface{}, err error) {exop := func(c *mgo.Collection) error {return c.Find(query).Sort(sort).Select(fields).Skip(skip).Limit(limit).All(&results)}err = witchCollection(collectionName, exop)return}
解釋說明
連接字串
連接字串可以使用mongodb標準形式
mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb
結構體聲明
type Person struct {Id_ bson.ObjectId `bson:"_id"`Name string `bson:"tname"` //bson:"name" 表示mongodb資料庫中對應的欄位名稱Phone string `bson:"tphone"`}
注意Person的欄位首字母大寫,不然不可見。通過bson:”name”這種方式可以定義MongoDB中集合的欄位名,如果不定義,mgo自動把struct的欄位名首字母小寫作為集合的欄位名。如果不需要獲得id_,Id_可以不定義,在插入的時候會自動產生。但是建議是通過程式產生,這樣可以提高mongodb的運行效率,也可以在插入完成之後直接返回ObjectId,供其他程式使用
手動建立一個ObjecitId
bson.NewObjectId()//建立一個objectid
更多請訪問 紅象UED