golang中使用mongodb的操作类以及如何封装
mgo简介
mongodb官方没有关于go的mongodb的驱动,因此只能使用第三方驱动,mgo就是使用最多的一种。
mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API实现了丰富的特性,并经过良好测试。
文档:http://godoc.org/gopkg.in/mgo.v2
安装与使用
安装
go get gopkg.in/mgo.v2
go中使用
package main
import (
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
type Person struct {
Id bson.ObjectId `bson:"_id"`
Name string `bson:"tname"` //bson:"name" 表示mongodb数据库中对应的字段名称
Phone string `bson:"tphone"`
}
const URL = "192.168.1.43:50000" //mongodb连接字符串
var (
mgoSession *mgo.Session
dataBase = "mydb"
)
/**
* 公共方法,获取session,如果存在则拷贝一份
*/
func getSession() *mgo.Session {
if mgoSession == nil {
var err error
mgoSession, err = mgo.Dial(URL)
if err != nil {
panic(err) //直接终止程序运行
}
}
//最大连接池默认为4096
return mgoSession.Clone()
}
//公共方法,获取collection对象
func witchCollection(collection string, s func(*mgo.Collection) error) error {
session := getSession()
defer session.Close()
c := session.DB(dataBase).C(collection)
return s(c)
}
/**
* 添加person对象
*/
func AddPerson(p Person) string {
p.Id = bson.NewObjectId()
query := func(c *mgo.Collection) error {
return c.Insert(p)
}
err := witchCollection("person", query)
if err != nil {
return "false"
}
return p.Id.Hex()
}
/**
* 获取一条记录通过objectid
*/
func GetPersonById(id string) *Person {
objid := bson.ObjectIdHex(id)
person := new(Person)
query := func(c *mgo.Collection) error {
return c.FindId(objid).One(&person)
}
witchCollection("person", query)
return person
}
//获取所有的person数据
func PagePerson() []Person {
var persons []Person
query := func(c *mgo.Collection) error {
return c.Find(nil).All(&persons)
}
err := witchCollection("person", query)
if err != nil {
return persons
}
return persons
}
//更新person数据
func UpdatePerson(query bson.M, change bson.M) string {
exop := func(c *mgo.Collection) error {
return c.Update(query, change)
}
err := witchCollection("person", exop)
if err != nil {
return "true"
}
return "false"
}
/**
* 执行查询,此方法可拆分做为公共方法
* [SearchPerson description]
* @param {[type]} collectionName string [description]
* @param {[type]} query bson.M [description]
* @param {[type]} sort bson.M [description]
* @param {[type]} fields bson.M [description]
* @param {[type]} skip int [description]
* @param {[type]} limit int) (results []interface{}, err error [description]
*/
func SearchPerson(collectionName string, query bson.M, sort string, fields bson.M, skip int, limit int) (results []interface{}, err error) {
exop := func(c *mgo.Collection) error {
return c.Find(query).Sort(sort).Select(fields).Skip(skip).Limit(limit).All(&results)
}
err = witchCollection(collectionName, exop)
return
}
解释说明
连接字符串
连接字符串可以使用mongodb标准形式
mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb
结构体声明
type Person struct {
Id_ bson.ObjectId `bson:"_id"`
Name string `bson:"tname"` //bson:"name" 表示mongodb数据库中对应的字段名称
Phone string `bson:"tphone"`
}
注意Person的字段首字母大写,不然不可见。通过bson:”name”这种方式可以定义MongoDB中集合的字段名,如果不定义,mgo自动把struct的字段名首字母小写作为集合的字段名。如果不需要获得id_,Id_可以不定义,在插入的时候会自动生成。但是建议是通过程序生成,这样可以提高mongodb的运行效率,也可以在插入完成之后直接返回ObjectId,供其他程序使用
手动创建一个ObjecitId
bson.NewObjectId()//创建一个objectid
更多请访问 红象UED
golang中使用mongodb的操作类以及如何封装的更多相关文章
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- Golang中的各种时间操作
Golang中的各种时间操作 需求 时间格式的转换比较麻烦,自己写了个工具,可以通过工具中的这些方法相互调用转成自己想要的格式,代码如下,后续有新的函数再添加 实现代码 package utils i ...
- 关于golang中IO相关的Buffer类浅析
io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } t ...
- golang中使用mongodb
mgo简介 mongodb官方没有关于go的mongodb的驱动,因此只能使用第三方驱动,mgo就是使用最多的一种. mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API ...
- [技术干货-算子使用] Mindspore 控制流中存在原地更新操作类副作用算子时循环值不更新问题记录
关于mindspore 原地更新类算子的一点思考记录如下: 现象记录: 原始测试代码 错误结果复现: 分析: 如果在场景中加入42行的copy()操作此时cpu的结果就会正确,但是gpu的结果则不受c ...
- golang中的 time 常用操作
时间戳 时间戳 (例如: 1554714009) time.now().Unix() 格式时间 (例如: 2019-04-08 17:00:09) time.Now().Format("20 ...
- Golang 对MongoDB的操作简单封装
使用MongoDB的Go驱动库 mgo,对MongoDB的操作做一下简单封装 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s ...
- .Net Core MongoDB 简单操作。
一:MongoDB 简单操作类.这里引用了MongoDB.Driver. using MongoDB.Bson; using MongoDB.Driver; using System; using S ...
- 第四章输入/输出(I/O)4.2PCL中I/O模块及类介绍
PCL中I/O库提供了点云文件输入输出相关的操作类,并封装了OpenNI兼容的设备源数据获取接口,可直接从众多感知设备获取点云图像等数据.I/O模块利用21个类和28个函数实现了对点云的获取.读入.存 ...
随机推荐
- BZOJ 1221 [HNOI2001] 软件开发(费用流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1221 [题目大意] 每天对毛巾都有一定的需求ni,每天可以花f价值每条购买毛巾, 当天 ...
- [UOJ348]州区划分
设$f_i$表示选状态为$i$的点的答案,$s_i$表示状态为$i$的点权和,$不存在欧拉回路g_i=[i\,不存在欧拉回路]s_i$ 那么$f_i=\sum\limits_{j\subset i}\ ...
- Ucenter添加新应用
最近手头上有个项目需要用到Ucenter跟Discuz和UcHome整合到一起,使用同步登录.注册,使用同一的用户数据. 以前没用过Ucenter,第一次接触,看过官网的教程感觉不难.于是开始动手,下 ...
- 【荐】利用NAT、Host-Only双虚拟网卡,实现Virtual Box中CentOS5.x联网
一.虚拟机与主机互联,通常有三种方式,详细介绍请看: VMware虚拟机三种网络模式(Bridged,Nat,Host-only)区别详解 二.通过网络共享,Host-Only联网,详细案例请看: W ...
- simple_strtoul()
//此函数有以下几点值得注意: //1.第一个参数中的const.一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该参数 // 内容(一般是指针指向的内容),则可以声明为co ...
- JDK文件夹结构及文件解释
bin:一些命令行工具,包括Java编译器的启动命令. lib:开发工具使用的文件,一些类库 jre:java程序运行环境所需文件
- SqlServer查看对象(表、存储过程、函数)在哪些地方被引用或引用哪些地方
对象(如表)-->右键-->查看依赖关系 依赖于[]的对象:列出哪些存储过程.函数引用了该表 []依赖的对象:列出该存储过程.函数依赖了哪些表.函数.存储过程
- Android进阶笔记:AIDL内部实现详解 (一)
AIDL内部实现详解 (一) AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件 ...
- intellij idea 热部署、热加载设置方法
https://blog.csdn.net/wangjun5159/article/details/55223630 https://blog.csdn.net/wangjun5159/article ...
- ECCV 2014 Oral Paper
今年的ECCV 的paper已经挂到了网上.本文整了当中Oral Paper. 一,Tracking and Activity Recognition