golang中使用mongodb的操做類以及如何封裝

mgo簡介


mongodb官方沒有關於go的mongodb的驅動,所以只能使用第三方驅動,mgo就是使用最多的一種。
mgo(音mango)是MongoDB的Go語言驅動,它用基於Go語法的簡單API實現了豐富的特性,並通過良好測試。mongodb

官網:http://labix.org/mgo數據庫

文檔:http://godoc.org/gopkg.in/mgo.v2session

安裝與使用


安裝測試

go get gopkg.in/mgo.v2

go中使用.net

package main

import (
    "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.Session
    dataBase   = "mydb"
)

/**
 * 公共方法,獲取session,若是存在則拷貝一份
 */
func getSession() *mgo.Session {
    if mgoSession == nil {
        var err error
        mgoSession, err = mgo.Dial(URL)
        if err != nil {
            panic(err) //直接終止程序運行
        }
    }
    //最大鏈接池默認爲4096
    return 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 []Person
    query := 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標準形式code

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,供其餘程序使用對象

手動建立一個ObjecitIdip

bson.NewObjectId()//建立一個objectid

更多請訪問 紅象UEDci

相關文章
相關標籤/搜索