Golang-MongoDb方法封装

Author Avatar
Yangzzz 7月 30, 2020
473字 | 2分 |
  • 在其它设备中阅读本文章

Golang操作MongoDb

安装依赖

go get -u github.com/globalsign/mgo

MongoDb的方法封装

/**
* @Author: myxy99 <myxy99@foxmail.com>
* @Date: 2020/7/30 14:16
 */
package mongoDb

import (
    "fmt"
    "github.com/globalsign/mgo"
    "log"
)

type ClientImp interface {
    connect(db, collection string) (*mgo.Session, *mgo.Collection)
    Insert(db, collection string, docs ...interface{}) error
    FindOne(db, collection string, query, selector, result interface{}) error
    FindAll(db, collection string, query, selector, result interface{}) error
    Update(db, collection string, query, update interface{}) error
    Remove(db, collection string, query interface{}) error
}

type Client struct {
    cfg CallerCfg
    m   *mgo.Session
}

type cLogger struct{}

func (c *cLogger) Output(calldepth int, s string) error {
    fmt.Println("calldepth: ", calldepth, ", s: ", s)
    return nil
}

func (c *Client) connect(db, collection string) (*mgo.Session, *mgo.Collection) {
    s := c.m.Copy()
    return s, s.DB(db).C(collection)
}

func (c *Client) Insert(db, collection string, docs ...interface{}) error {
    ms, mc := c.connect(db, collection)
    defer ms.Close()
    return mc.Insert(docs...)
}

func (c *Client) FindOne(db, collection string, query, selector, result interface{}) error {
    ms, mc := c.connect(db, collection)
    defer ms.Close()
    return mc.Find(query).Select(selector).One(result)
}

func (c *Client) FindAll(db, collection string, query, selector, result interface{}) error {
    ms, mc := c.connect(db, collection)
    defer ms.Close()
    return mc.Find(query).Select(selector).All(result)
}

func (c *Client) Update(db, collection string, query, update interface{}) error {
    ms, mc := c.connect(db, collection)
    defer ms.Close()
    return mc.Update(query, update)
}

func (c *Client) Remove(db, collection string, query interface{}) error {
    ms, mc := c.connect(db, collection)
    defer ms.Close()
    return mc.Remove(query)
}

func Run(cfg CallerCfg) (c *Client, err error) {
    var (
        m        *mgo.Session
        dialInfo *mgo.DialInfo
    )
    dialInfo = &mgo.DialInfo{
        Addrs:    []string{cfg.URL},
        Source:   cfg.Source,
        Username: cfg.User,
        Password: cfg.Password,
    }
    m, err = mgo.DialWithInfo(dialInfo)
    if err != nil {
        log.Fatalln("create session error ", err)
    }
    mgo.SetLogger(&cLogger{})
    mgo.SetDebug(cfg.Debug)
    // Optional. Switch the session to a monotonic behavior.
    m.SetMode(mgo.Monotonic, true)
    return &Client{cfg, m}, err
}

使用

/**
* @Author: myxy99 <myxy99@foxmail.com>
* @Date: 2020/7/30 14:34
 */
package mongoDb

import (
    "github.com/globalsign/mgo/bson"
    "testing"
)

type Movie struct {
    Id   bson.ObjectId `bson:"_id" json:"id"`
    Name string        `bson:"name" json:"name"`
}

const (
    db         = "Movies"
    collection = "MovieModel"
)

func TestClient_Insert(t *testing.T) {
    var (
        cfg CallerCfg
        c   *Client
        err error
    )
    cfg = CallerCfg{
        Debug:    true,
        URL:      "127.0.0.1:27017",
        Source:   "admin",
        User:     "",
        Password: "",
    }
    c, err = Run(cfg)
    if err != nil {
        panic(err.Error())
    }
    err = c.Insert(db, collection, Movie{
        Id:   bson.NewObjectId(),
        Name: "test123",
    })
}

本文使用CC BY-NC-SA 3.0 中国大陆协议许可
本文链接:https://myxy99.cn/posts/golang/c3fc687c.html