mgo是go编写的mongodb的数据库驱动,集成到项目中进行mongodb的操作很流畅,以下是对其的一些简单封装,具体使用可随意改动封装。

安装

go get gopkg.in/mgo.v2

使用

引入第三方包

import ("gopkg.in/mgo.v2""gopkg.in/mgo.v2/bson"
)

初始化连接

var (GVA_MONGO_DB *mgo.Session
)global.GVA_MONGO_DB = initialize.Mongodb() // 如果MongoDB设置了用户权限需要使用下面的方法操作
func Mongodb() *mgo.Session {//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 = ss, err := mgo.Dial("127.0.0.1:27017")if err != nil {log.Fatalf("Create Session: %s\n", err)}return s
}

连接具体的数据和文档

每一次操作都copy一份 Session,避免每次创建Session,导致连接数量超过设置的最大值
获取文档对象 c := Session.DB(db).C(collection)

func connect(db, collection string) (*mgo.Session, *mgo.Collection) {ms := global.GVA_MONGO_DB.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)
}// bson映射真实对应mongodb中的字段值
type Incomes struct {Symbol    string  `bson:"symbol"`     // 交易对Income    float64 `bson:"income"`     // 资金流数量,正数代表流入,负数代表流出CreatedAt int64   `bson:"created_at"` // 创建时间
}inComes := Incomes{Symbol:   "BTCUSDT",Income:    "12312",CreatedAt: 1618489385,
}err := db.Insert("Fund", "Incomes", inComes)

查询数据

db:操作的数据库
collection:操作的文档(表)
query:查询条件
selector:需要过滤的数据(projection)
result:查询到的结果

func FindOne(db, collection, sort string, query, selector, result interface{}) error {ms, c := connect(db, collection)defer ms.Close()return c.Find(query).Select(selector).Sort(sort).One(result)
}func FindAll(db, collection, sort string, query, selector, result interface{}) error {ms, c := connect(db, collection)defer ms.Close()return c.Find(query).Select(selector).Sort(sort).All(result)
}

可自定义修改封装

排序 Sort//按age升序,如果要降序Sort("-age")
iter = c.Find(bson.M{"age": bson.M{"$gte": 33}}).Sort("age").Iter()限定结果数量 Limit//使用Limit限定只去5条记录
iter = c.Find(bson.M{"age": bson.M{"$gte": 20}}).Sort("age").Limit(5).Iter()跳过指定数量的记录 Skip//跳过两条记录,取接下来的5条记录
iter = c.Find(bson.M{"age": bson.M{"$gte": 20}}).Sort("age").Skip(2).Limit(5).Iter()计算记录的条数 CountrecordsCount, err := c.Find(bson.M{"age": bson.M{"$gte": 20}}).Count()

示例

// 查询title="标题"【=($eq)】,并且返回结果中去除`_id`字段
var result Data
err = db.FindOne(database, collection, bson.M{"title": "标题"}, bson.M{"_id":0}, &result)// 根据created_at排序 默认正序
fundNetValue := model.FundNetValue{}
mongodb.FindOne("Fund", "netValue", "-created_at", bson.M{}, bson.M{}, &fundNetValue)// 根据created_at排序 加-连接号 为倒序
mongodb.FindAll("Fund", "netAssets", bson.M{"-created_at": bson.M{"$gt": time - 86400, "$lte": time}}, bson.M{}, fundNetAssets)// !=($ne)
bson.M{"name": bson.M{"$ne": "Jimmy Kuu"}}// >($gt)
bson.M{"age": bson.M{"$lt": 32}}// <($lt)
bson.M{"age": bson.M{"$lt": 32}}// >=($gte)
bson.M{"age": bson.M{"$gte": 33}}// <=($lte)
bson.M{"age": bson.M{"$lte": 31}}// in($in)
bson.M{"name": bson.M{"$in": []string{"Jimmy Kuu", "Tracy Yu"}}}// not in($nin)
bson.M{"name": bson.M{"$nin": []string{"Jimmy Kuu", "Tracy Yu"}}}// 是否包含存在($exists)
bson.M{"city": bson.M{"$exists": true}}// 键值为null(键存在,键值为null)
bson.M{"city": bson.M{"$in": []interface{}{nil}, "$exists": true}}// $size 键值长度为指定值的数组
bson.M{"interests": bson.M{"$size": 3}}// $all 包含所有值的匹配
bson.M{"interests": bson.M{"$all": []string{"music", "reading"}}}// 多条件查询
// and($and)
bson.M{"city": "Shanghai", "age": bson.M{"$gte": 33}}// or($or)
bson.M{"$or": []bson.M{bson.M{"name": "Jimmy Kuu"}, bson.M{"age": 31}}}

更新数据

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": "更新标题"}})// 修改字段的值($set)
bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$set": bson.M{ "name": "Jimmy Gu", "age": 34, }}// 字段增加值 inc($inc)
bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$inc": bson.M{ "age": -1, }}// 从数组中增加一个元素 push($push)
bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$push": bson.M{ "interests": "Golang", }}// 从数组中删除一个元素 pull($pull)
bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$pull": bson.M{ "interests": "Golang", }}

删除数据

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"})

分页查询

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()
}

go mgo包 简单封装 mongodb 数据库驱动相关推荐

  1. php mongoclient使用,PHP使用mongoclient简单操作mongodb数据库示例

    本文实例讲述了PHP使用mongoclient简单操作mongodb数据库.分享给大家供大家参考,具体如下: 最好回到<mongodb shell基础命令[进阶篇]>,再来看这里的内容,否 ...

  2. oracle19c数据库用11g驱动包,OJDBC14.jar包11g最新版数据库驱动官方版

    你是否在寻找好用的OJDBC14.jar 11g驱动包呢,快来下载OJDBC14.jar 11g正式版进行使用吧,它是最近上线的一款专业数据库驱动工具,也是一个oracle数据库中很常见的驱动包,它的 ...

  3. java socket发送定长报文_定长消息报文的组包与解包简单封装(Java实现)

    报文 组包 解包 在实际项目中经常会碰到不同系统之间的数据交换,有些是用webservice.有些则是使用发socket消息的方式,将需要发送的消息组装成特定格式的字符串或Xml格式的文件,再通过so ...

  4. 数据库驱动(JDBC Driver)jar包下载

    基于java开发语言常用的数据库驱动jar包下载 1. mysql数据库驱动jar包下载:http://dev.mysql.com/downloads/connector/j/ 2. oracle数据 ...

  5. Java操作MongoDB数据库CRUD(增删查改)

    Java操作MongoDB数据库CRUD(增删查改) 借助mongo-java-driver包,对MongoDB数据库的集合(DataTable)及文档(BSON对象数据)进行增删查改操作.本文的核心 ...

  6. mgo.v2无法连接MongoDB 5.0.x

    mgo.v2无法连接MongoDB 5.0.x 问题描述: MongoDB升级到5.0.1之后,使用gopkg.in/mgo.v2来连接MongoDB数据库时,发现验证时出现验证错误了.server ...

  7. 封装对MongoDB数据库的增删改查访问方法(基于MongoDB官方发布的C#驱动)

    本文利用MongoDB官方发布的C#驱动,封装了对MongoDB数据库的增删改查访问方法. 先用官方提供的mongo-csharp-driver ,当前版本为1.7.0.4714 编写数据库访问帮助类 ...

  8. (一) windows 10 下安装 mongodb 并 globalsign/mgo 包的简单使用

    文章目录 windows 下安装 小坑 运行 mongodb 服务器 连接 mongodb 使用 globalsign/mgo 操作 mongodb windows 下安装 在 windows 下安装 ...

  9. MacOS系统下简单安装以及配置MongoDB数据库(一)

    最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. 项目一共四部分: 1.MacOS下 ...

最新文章

  1. 资源 | 5月Python好文TOP 10新鲜出炉,你都看了吗?
  2. python培训班一般多少钱-报个python培训班多少钱
  3. 移动端开发 rem 单位使用问题
  4. 当double类型数学计算精度偏差解决
  5. NIO 之 Channel
  6. JavaScript实现继承的方式和各自的优缺点
  7. SpringBoot+Shiro放行OPTIONS请求,解决跨域问题
  8. 查看windows系统信息
  9. batch批处理(转载)
  10. 基于Java毕业设计移动电商网站源码+系统+mysql+lw文档+部署软件
  11. 你在公司项目里面看过哪些操蛋的代码?
  12. Delphi 跨语言环境 乱码问题
  13. 计算机水平等级全称,全国计算机等级考试介绍
  14. 求助!神舟笔记本BIOS进不去!
  15. 《失业七个月,面试六十家公司》的深圳体验
  16. 微信VS抖音_四大品类投放分析报告——护肤、彩妆、美食饮品、母婴用品
  17. MySQL数据库入门实战教程
  18. Linux系统调用之lseek函数
  19. 氪见激光雷达性能参数介绍
  20. 【经历】苹果企业账号申请记录,比想象中要简单

热门文章

  1. BIOS 并口设置选项SPP, EPP, ECP区别
  2. 今天Sapphire来短消息问我“一件有点隐私”的事情,:)
  3. Unity3D手游开发日记(3) - 场景加载进度条的完美方案
  4. python简单的分形图片
  5. VR、AR和MR这些技术的区别
  6. 手机总是自动重启怎么处理
  7. POI导出word表格 office打开没问题 wps打开列有问题
  8. 迪士尼的漫威宇宙第四阶段计划出炉
  9. 如何写出公众号爆文?分享你一份爆文写作秘籍
  10. 自媒体平台有哪些?如何找到一个适合自己的自媒体平台?