35

Golang 对MongoDB的操作简单封装

 5 years ago
source link: https://studygolang.com/articles/13461?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Golang 对MongoDB的操作简单封装

使用 MongoDB 的Go驱动库 mgo ,对 MongoDB 的操作做一下简单封装

初始化

  • 操作没有用户权限的 MongoDB
var globalS *mgo.Session

func init() {
    s, err := mgo.Dial(dialInfo)
    if err != nil {
        log.Fatalf("Create Session: %s\n", err)
    }
    globalS = s
}
  • 如果 MongoDB 设置了用户权限需要使用下面的方法操作
func init() {
    dialInfo := &mgo.DialInfo{
        Addrs:     []string{dbhost}, //数据库地址 dbhost: mongodb://user@123456:127.0.0.1:27017
        Timeout:   timeout,                  // 连接超时时间 timeout: 60 * time.Second
        Source:    authdb,                   // 设置权限的数据库 authdb: admin
        Username:  authuser,                 // 设置的用户名 authuser: user
        Password:  authpass,                // 设置的密码 authpass: 123456
        PoolLimit: poollimit,       // 连接池的数量 poollimit: 100
    }

    s, err := mgo.DialWithInfo(dialInfo)
    if err != nil {
        log.Fatalf("Create Session: %s\n", err)
    }
    globalS = s
}

连接具体的数据和文档

每一次操作都copy一份 Session ,避免每次创建 Session ,导致连接数量超过设置的最大值

获取文档对象 c := Session.DB(db).C(collection)

func connect(db, collection string) (*mgo.Session, *mgo.Collection) {
    ms := globalS.Copy()
    c := ms.DB(db).C(collection)
    ms.SetMode(mgo.Monotonic, true)
    return ms, c
}

插入数据

每次操作之后都要主动关闭 Session defer Session.Close()

db:操作的数据库

collection:操作的文档(表)

doc:要插入的数据

func Insert(db, collection string, doc interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    return c.Insert(doc)
}

// test
data := &Data{
    Id:      bson.NewObjectId().Hex(),
    Title:   "标题",
    Des:     "博客描述信息",
    Content: "博客的内容信息",
    Img:     "https://upload-images.jianshu.io/upload_images/8679037-67456031925afca6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700",
    Date:    time.Now(),
}

err := db.Insert("Test", "TestModel", data)

查询数据

db:操作的数据库

collection:操作的文档(表)

query:查询条件

selector:需要过滤的数据(projection)

result:查询到的结果

func FindOne(db, collection string, query, selector, result interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    return c.Find(query).Select(selector).One(result)
}

func FindAll(db, collection string, query, selector, result interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    return c.Find(query).Select(selector).All(result)
}

//test 查询title="标题",并且返回结果中去除`_id`字段
var result Data
err = db.FindOne(database, collection, bson.M{"title": "标题"}, bson.M{"_id":0}, &result)

更新数据

db:操作的数据库

collection:操作的文档(表)

selector:更新条件

update:更新的操作

func Update(db, collection string, selector, update interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    return c.Update(selector, update)
}

//更新,如果不存在就插入一个新的数据 `upsert:true`
func Upsert(db, collection string, selector, update interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    _, err := c.Upsert(selector, update)
    return err
}

// `multi:true`
func UpdateAll(db, collection string, selector, update interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    _, err := c.UpdateAll(selector, update)
    return err
}

//test
err = db.Update(database, collection, bson.M{"_id": "5b3c30639d5e3e24b8786540"}, bson.M{"$set": bson.M{"title": "更新标题"}})

删除数据

db:操作的数据库

collection:操作的文档(表)

selector:删除条件

func Remove(db, collection string, selector interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    return c.Remove(selector)
}

func RemoveAll(db, collection string, selector interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    _, err := c.RemoveAll(selector)
    return err
}

//test
err = db.Remove(database,collection,bson.M{"_id":"5b3c30639d5e3e24b8786540"})

分页查询

db:操作的数据库

collection:操作的文档(表)

page:当前页面

limit:每页的数量值

query:查询条件

selector:需要过滤的数据(projection)

result:查询到的结果

func FindPage(db, collection string, page, limit int, query, selector, result interface{}) error {
    ms, c := connect(db, collection)
    defer ms.Close()

    return c.Find(query).Select(selector).Skip(page * limit).Limit(limit).All(result)
}

其他操作

func IsEmpty(db, collection string) bool {
    ms, c := connect(db, collection)
    defer ms.Close()
    count, err := c.Count()
    if err != nil {
        log.Fatal(err)
    }
    return count == 0
}

func Count(db, collection string, query interface{}) (int, error) {
    ms, c := connect(db, collection)
    defer ms.Close()
    return c.Find(query).Count()
}

完整的代码请参考


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK