首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 对MongoDB的操作简单封装

Golang 对MongoDB的操作简单封装

作者头像
程序员同行者
发布2019-02-22 09:45:23
2.2K0
发布2019-02-22 09:45:23
举报
文章被收录于专栏:程序员同行者程序员同行者

使用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()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初始化
  • 连接具体的数据和文档
  • 插入数据
  • 查询数据
  • 更新数据
  • 删除数据
  • 分页查询
  • 其他操作
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档