Go与MongoDB

作者: myWsq | 来源:发表于2018-03-13 15:19 被阅读73次

    go没有类这一概念,对于变量的捆绑都是由键值对形式的结构体(struct)实现的。
    这对同样是以键值对形式存储的mongodb以及json都非常友好。所以在go中,并不是很依赖建立在mongodb之上的orm,使用比较底层的驱动级的接口即可方便的进行操作。

    本篇文章将以商品(goods)为例,简单讲解如何使用mgo进行简单的增删改查操作。

    mgo

    mgo (pronounced as mango) is a MongoDB driver for the Go language that implements a rich and well tested selection of features under a very simple API following standard Go idioms.

    打开终端输入

    go get gopkg.in/mgo.v2

    在当前pkg下新建goods.go文件, 对mgo提供的接口进行一些封装:

    func connect(cName string) (*mgo.Session, *mgo.Collection) {
        session, err := mgo.Dial("$mongoHost") //Mongodb's connection
        if err != nil {
            panic(err)
        }
        session.SetMode(mgo.Monotonic, true)
        //return a instantiated collect
        return session, session.DB(mongoDB).C(cName)
    }
    

    定义goods实例:

    type Goods struct {
        ID    string 
        Name  string 
        Price string 
        Url   string
    }
    

    接下来我们要存入第一条记录:

    func (a *Goods) save() error {
        s, c := connect("goods")
        defer s.Close()
        a.ID = bson.NewObjectId().Hex()
        return c.Insert(&a)
    }
    

    特别注意: 如果在定义时将ID的类型定义为 bson.ObjectID,并指定bson标签为_id,mongodb将不会为它分配新的id。但是这样的结构在与json做交互时不是很方便。

    在做记录的查询时,需要新建一个同类型的结构体或结构体数组,然后执行Find操作,如果参数为空,则返回全部记录:

    func (a Goods) all() ([]Goods, error) {
        s, c := connect("goods")
        defer s.Close()
        var group []Goods
        err := c.Find(nil).All(&group)
        return group, err
    }
    
    func (a *Goods) get(id string) error {
        s, c := connect("goods")
        defer s.Close()
        return c.Find(bson.M{"id": id}).One(&a)
    }
    

    如果你熟悉mongodb的操作,可以看出,这样的操作与直接在shell内操作几乎相同。

    删除:

    func (a Goods) delete() error {
        s, c := connect("goods")
        defer s.Close()
        return c.Remove(bson.M{"id": a.ID})
    }
    

    更新:

    func (a *Goods) update() error {
        s, c := connect("goods")
        defer s.Close()
        c.Update(bson.M{"id": a.ID}, a)
        return a.get(a.ID)
    }
    

    相关文章

      网友评论

        本文标题:Go与MongoDB

        本文链接:https://www.haomeiwen.com/subject/jquzfftx.html