golang mgo 使用概览

 : jank    :   : 2921    : 2017-12-20 18:41  go

      1.获取应用包

    go get gopkg.in/mgo.v

    2.连接mongo以及常用方法实例

    package main
    import (
        log "code.google.com/p/log4go"
        "errors"
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"
    )
    var (
        errNoSession2 = errors.New("no session")
        mgoman  = MgoManager2{}
    )
    type MgoArg2 struct {
        Servers   string
        Username  string
        Password  string
        Defaultdb string
    }
    type MgoManager2 struct {
        arg     *MgoArg2
        session *mgo.Session `json:"-" bson:'-'`
    }
    func NewMgoManager2(arg *MgoArg2) *MgoManager2 {
        return &MgoManager2{arg: arg}
    }
    func (this *MgoManager2) Init() (err error) {
        if this.session, err = mgo.Dial(this.arg.Servers); err == nil {
            this.session.SetMode(mgo.Eventual, true) //最终一致性
            // admin数据库中创建的用户,只需要授权一次,即可访问其他数据库
            if err = this.session.DB(this.arg.Defaultdb).Login(this.arg.Username, this.arg.Password); err != nil {
                log.Error("err: %s
    ", err)
                return
            }
        }
        return
    }
    
    func (this *MgoManager2) GetSession() (session *mgo.Session) {
        if this != nil && this.session != nil {
            session = this.session.Clone()
            session.SetPoolLimit(100) //mgo默认4096
        }
        return
    }
    
    type Test struct {
        "Name"       string `bson:"name"`
        "Age"        uint   `bson:"age"`
        "Timestamp"  int64  `bson:"timestamp"`
    }
    
    func main(){
        var Arg = &MgoArg2{Servers: "0.0.0.0", Username: "admin", Password: "admin1344", Defaultdb: "admin"}
        mgoman = NewMgoManager2(Arg)
        if err = mgoman.Init(); err != nil {
    	log.Error("mgoman.Init() failed(%s)", err)
        }
        //新建连接
        session = mgoman.GetSession()
        defer session.Close()
        c := session.DB("admin).C("test")  //admin为mongo database,test为collection,
        //---------------------------------插入--------------------------------------
        
        //插入一行数据
        arg := &Test{"Name":"jank","Age":23, "Timestamp":1513672464}
        if err = c.Insert(arg); err != nil {
    	log.Error("c.Insert() failede(%s)", err)
           	return
        }
        
        //---------------------------------修改--------------------------------------
        
        //修改用户名为jank的数据行name改为liberalist,age改为24
        if err = c.Update(bson.M{"name":"jank"},bson.M{"%set":bson.M{"name":"liberalist", "age":24}}); err != nil {
            log.Error(err)
            return
        }
        
        //---------------------------------删除--------------------------------------
        
        //删除名为jank的数据行
        if err = c.Remove(bson.M{"Name":"jank"}); err != nil {
            log.Errro("c.Remove() failed(%s)", err)
            return
        }
        
        //---------------------------------查询--------------------------------------
        var( 
            ress = []*Test{}
            res = new(Test)
           )
           
        //查询test表中全部数据
        if err := c.Find(nil).All(&ress); err != nil {        
            log.Error(err)
            return
        }
        //查询主键_id为5a38c744613863a836001a57的用户(注:golang mgo需要使用bson包中的ObjectIdHex()才能正确查询)
        if err := c.Find(bson.M{"_id": bson.ObjectIdHex(arg.Id)}).One(res); err != nil{
            log.Error(err)
            return
        }
        
        //查询test表中年龄大于或等于10,并按照timestamp的顺序排列(倒序:"-timestamp"),且只取一行
        if err := c.Find(bson.M{"age":bson.M{"$gte":10}).Sort("timestamp").Limit(1).One(res); err != nil {  
            log.Error(err)
            return
        }
        
        //查询test表中大于或等于10岁的相同年龄中注册最早的一个用户的全部信息(使用聚合查询)
        aggregate := []bson.M{
    		bson.M{
    			"$match": bson.M{
    				"age": bson.M{
    					"$gte": 10,
    				},
    			},
    		},
    		bson.M{
                            "$sort": bson.M{
                                    "timestamp": 1,
                            },
    		},
    		bson.M{
    			"$group": bson.M{
    				"_id":         "$age",
    				"age": bson.M{"$first": "$age"},      
    				"timestamp":   bson.M{"$min": "$timestamp"},
    				"name": bson.M{"$first": "$name"},
    			},
    		},
    		bson.M{
    			"$project": bson.M{
    				"_id":         0, //不显示_id
    			        "age":         "$age",
    			        "timestamp":   "$timestamp",
    			        "name":        "$name",
    			},
    		},
    	}
    	if err = c.Pipe(aggregate).All(&ress); err != nil {
    		log.Error("c.Pipe() failed(%s)", err)
    		return
    	}
         
        
    }

    更多相关方法请参考:http://labix.org/mgo



      



   

备案编号:赣ICP备15011386号

联系方式:qq:1150662577    邮箱:1150662577@qq.com