Go 中 mgo.v2 操作MongoDB

前期有一个项目因为历史原因大胆采用了近年窜火非关系型数据库 mongoDB ,据传说它与GO 结合是绝配;好吧,我又掉坑里面了。

在go 里面操作mongodb 数据库,使用的引擎是 mgo.v2 ,  它相当于在JAVA 中  JDBC 这么个角色 ,它是 go 与 mongodb 间的通讯接口; 操作指令是由mgo 对象封装方法完成的。


按MVC 的规则,首先还是需要有 models ,在此创建对数据库的连接;

package models

import (

   "github.com/revel/revel"
   "gopkg.in/mgo.v2"
   //"fmt"
   "github.com/revel/config"
)

var (

   URL = "127.0.0.1:27017"
)

const (

   //URL = "127.0.0.1:27017"
   DbName = "DNSManager"

)

type Dao struct {

   session *mgo.Session
}

func NewDao() (*Dao, error){


   ccc,_ :=  config.ReadDefault( revel.BasePath + "/conf/app.conf"   )
   _URL,_:= ccc.String( "DBConfig" ,"URL")
   if _URL != ""{

      URL = _URL
   }

   session, err := mgo.Dial( URL )

   if err != nil {
      return nil, err
   }
   return &Dao{session}, nil
}

func (dao *Dao) Close() {

   dao.session.Close()
}


实现对数据的具体操作方法:

mongodb 中没有表,相同的概念为集合,实际可以理解为一个JSON 的数组。  这里可以定义一个对应的结构体( struct )

mongodb 中不采用标准的SQL 查询语句操作, 我们惯用的 select  / insert / delete 等SQL 语句在这儿用不了。 它有一套自己的语法(方法);这个后面再论讨;先看看代码:

type User struct {

   Id         bson.ObjectId
   UserName   string
   Password   string
   CityCode   string
   CityName   string
   ICO        string
   State      int
   Admin      bool
}

type UserQueue struct {

   Users   []User
}




func ( dao *Dao ) InitAdmin() bool{

   commCollection := dao.session.DB( DbName ).C( UserCollection )

   result := User{}   
   
   err := commCollection.Find( bson.M{ "admin": true } ).One( &result )

   var fAdmin bool

   if err != nil{


      /**
      * 无默认管理员
      * 创建一个默认默认管理员
      ======================*/
      var userInfo User
      userInfo.Admin = true
      userInfo.CityCode = "86"
      userInfo.CityName = "中国"
      userInfo.Password = "admin"
      userInfo.UserName = "admin"
      userInfo.Id = bson.NewObjectId()

      err = dao.InsertUser( &userInfo )

      if err == nil{

         fAdmin = true
      }else{

         fAdmin = false
      }

   }else{

      //有默认管理员存在
      fAdmin = true
   }

    return fAdmin

}


MVC 规范再来写一个Controllers 

在Controllers 中来调用 models 中的方法;

/**
* 初始化管理员,自动创建默认管理员
*/
func (c UserManager) InitAdmin() revel.Result{

    //fmt.Println( "func (c UserManager) InitAdmin()" )
   dao, err := models.NewDao()
   if err != nil {
      c.Response.Status = 500
      return c.RenderError(err)
   }
   defer dao.Close()

   HH :=  dao.InitAdmin()

   return nil

}