mongoDB的go語言驅動mgo介紹、使用

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

原文:http://blog.sina.com.cn/s/blog_4d8cf3140101mt6y.html

mgo使用指南

mgo簡介
mgo(音mango)是MongoDB的Go語言驅動,它用基於Go文法的簡單API實現了豐富的特性,並經過良好測試。
官方網站:http://labix.org/mgo。
golang.tc(golangtc.com)網站的資料存放區就是是用的MongoDB+mgo。近一年使用下來表現良好。

API文檔
下面是mgo、mgo/bson、mgo/txn的線上文檔。

mgo GoDoc GoWalker
mgo/bson GoDoc GoWalker
mgo/txn GoDoc GoWalker
安裝
安裝mgo之前請先安裝Golang和MongoDB,安裝過程不再贅述。

安裝bzr版本工具(mgo使用Bazaar作為版本控制系統,因安裝的時候需要去Bazaar拉取代碼)。

安裝命令

go get labix.org/v2/mgo
樣本
下面的代碼是個樣本。

package main import ( "fmt" "labix.org/v2/mgo" "labix.org/v2/mgo/bson" ) type Person struct { Name string Phone string } func main() { session, err := mgo.Dial("") if err != nil { panic(err) } defer session.Close() // Optional. Switch the session to a monotonic behavior. session.SetMode(mgo.Monotonic, true) c := session.DB("test").C("people") err = c.Insert(&Person{"Ale", "+55 53 8116 9639"}, &Person{"Cla", "+55 53 8402 8510"}) if err != nil { panic(err) } result := Person{} err = c.Find(bson.M{"name": "Ale"}).One(&result) if err != nil { panic(err) } fmt.Println("Phone:", result.Phone) }

啟動MongoDB,把上面代碼複製了跑一下,如果輸出下面內容,說明安裝成功。

Phone: +55 53 8116 9639
具體代碼什麼意思先不用管,後面講解每個方法的用法。

如何使用
下面介紹如何使用mgo,主要介紹集合的操作。對資料庫,使用者等操作,請自行查看文檔。

第一步當然是先匯入mgo包

import ( "labix.org/v2/mgo" "labix.org/v2/mgo/bson" )
串連伺服器
通過方法Dial()來和MongoDB伺服器建立串連。Dial()定義如下:

func Dial(url string) (*Session, error)
具體使用:

session, err := mgo.Dial(url)
如果是本機,並且MongoDB是預設連接埠27017啟動的話,下面幾種方式都可以。

session, err := mgo.Dial("") session, err := mgo.Dial("localhost") session, err := mgo.Dial("127.0.0.1") session, err := mgo.Dial("localhost:27017") session, err := mgo.Dial("127.0.0.1:27017")
如果不在本機或連接埠不同,傳入相應的地址即可。如:

mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb
切換資料庫
通過Session.DB()來切換相應的資料庫。

func (s *Session) DB(name string) *Database
如切換到test資料庫。

db := session.DB("test")
切換集合
通過Database.C()方法切換集合(Collection),這樣我們就可以通過對集合進行增刪查改操作了。

func (db *Database) C(name string) *Collection
如切換到`users`集合。

c := db.C("users")

對集合進行操作
介紹插入、查詢、修改、刪除操作。

先提一下ObjectId,MongoDB每個集合都會一個名為_id的主鍵,這是一個24位的16進位字串。對應到mgo中就是bson.ObjectId。

這裡我們定義一個struct,用來和集合對應。

type User struct { Id_ bson.ObjectId `bson:"_id"` Name string `bson:"name"` Age int `bson:"age"` JonedAt time.Time `bson:"joned_at"` Interests []string `bson:"interests"` }
註解
注意User的欄位首字母大寫,不然不可見。通過bson:”name”這種方式可以定義MongoDB中集合的欄位名,如果不定義,mgo自動把struct的欄位名首字母小寫作為集合的欄位名。如果不需要獲得id_,Id_可以不定義,在插入的時候會自動產生。
插入
插入方法定義如下:

func (c *Collection) Insert(docs ...interface{}) error
下面代碼插入兩條集合資料。

err = c.Insert(&User{ Id_: bson.NewObjectId(), Name: "Jimmy Kuu", Age: 33, JoinedAt: time.Now(), Interests: []string{"Develop", "Movie"}, }) if err != nil { panic(err) } err = c.Insert(&User{ Id_: bson.NewObjectId(), Name: "Tracy Yu", Age: 31, JoinedAt: time.Now(), Interests: []string{"Shoping", "TV"}, }) if err != nil { panic(err) }
這裡通過bson.NewObjectId()來建立新的ObjectId,如果建立完需要用到的話,放在一個變數中即可,一般在Web開發中可以作為參數跳轉到其他頁面。

通過MongoDB用戶端可以發現,兩條即可已經插入。

{ "_id" : ObjectId( "5204af979955496907000001" ), "name" : "Jimmy Kuu", "age" : 33, "joned_at" : Date( 1376038807950 ), "interests" : [ "Develop", "Movie" ] } { "_id" : ObjectId( "5204af979955496907000002" ), "name" : "Tracy Yu", "age" : 31, "joned_at" : Date( 1376038807971 ), "interests" : [ "Shoping", "TV" ] }

查詢
通過func (c *Collection) Find(query interface{}) *Query來進行查詢,返回的Query struct可以有附加各種條件來進行過濾。

通過Query.All()可以獲得所有結果,通過Query.One()可以獲得一個結果,注意如果沒有資料或者數量超過一個,One()會報錯。

條件用bson.M{key: value},注意key必須用MongoDB中的欄位名,而不是struct的欄位名。

無條件查詢
查詢所有

var users []User c.Find(nil).All(&users) fmt.Println(users)
上面代碼可以把所有Users都查出來:

[{ObjectIdHex("5204af979955496907000001") Jimmy Kuu 33 2013-08-09 17:00:07.95 +0800 CST [Develop Movie]} {ObjectIdHex("5204af979955496907000002") Tracy Yu 31 2013-08-09 17:00:07.971 +0800 CST [Shoping TV]}]
根據ObjectId查詢
id := "5204af979955496907000001" objectId := bson.ObjectIdHex(id) user := new(User) c.Find(bson.M{"_id": objectId}).One(&user) fmt.Println(user)
結果如下:

&{ObjectIdHex("5204af979955496907000001") Jimmy Kuu 33 2013-08-09 17:00:07.95 +0800 CST [Develop Movie]}

更簡單的方式是直接用FindId()方法:

c.FindId(objectId).One(&user)
註解
注意這裡沒有處理err。當找不到的時候用One()方法會出錯。
單條件查詢
=($eq)
c.Find(bson.M{"name": "Jimmy Kuu"}).All(&users)
!=($ne)
c.Find(bson.M{"name": bson.M{"$ne": "Jimmy Kuu"}}).All(&users)
>($gt)
c.Find(bson.M{"age": bson.M{"$gt": 32}}).All(&users)
<($lt)
c.Find(bson.M{"age": bson.M{"$lt": 32}}).All(&users)
>=($gte)
c.Find(bson.M{"age": bson.M{"$gte": 33}}).All(&users)
<=($lte)
c.Find(bson.M{"age": bson.M{"$lte": 31}}).All(&users)
in($in)
c.Find(bson.M{"name": bson.M{"$in": []string{"Jimmy Kuu", "Tracy Yu"}}}).All(&users)
多條件查詢
and($and)

c.Find(bson.M{"name": "Jimmy Kuu", "age": 33}).All(&users)
or($or)
c.Find(bson.M{"$or": []bson.M{bson.M{"name": "Jimmy Kuu"}, bson.M{"age": 31}}}).All(&users)
修改
通過func (*Collection) Update來進行修改操作。

func (c *Collection) Update(selector interface{}, change interface{}) error
注意修改單個或多個欄位需要通過$set操作符號,否則集合會被替換。

修改欄位的值($set)
c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$set": bson.M{ "name": "Jimmy Gu", "age": 34, }})
inc($inc)
欄位增加值

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$inc": bson.M{ "age": -1, }})
push($push)
從數組中增加一個元素

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$push": bson.M{ "interests": "Golang", }})
pull($pull)
從數組中刪除一個元素

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$pull": bson.M{ "interests": "Golang", }})
刪除
c.Remove(bson.M{"name": "Jimmy Kuu"})

這裡也支援多條件,參考多條件查詢。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.