mongo官方没有golang 的官方驱动,但是有一个社区驱动:
http://labix.org/mgo
api文档:https://godoc.org/gopkg.in/mgo.v2#Collection.Update
数据的连接操作请看的我的上一篇博客,本文重点介绍mgo的CURD操作及遇到的坑。
mog的文档可以不用特别的创建,在数据插入的时候,如果驱动发现文档不存在,会自动创建。
连接操作
type Operater struct {
mogSession *mgo.Session
dbname string
document string
}
//集合的结构 其他中AGE NAME HEIGHT 名字的首字母必须大写,如果不无法访问到
type person struct {
AGE int
NAME string
HEIGHT int
}
//连接数据库
func (operater *Operater) connect() error {
mogsession, err := mgo.Dial(url)
if err != nil {
fmt.Println(err)
return err
}
operater.mogSession=mogsession
return nil
}
插入操作
//插入
func (operater *Operater) insert( p *person) error {
collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
err:=collcetion.Insert(p)
return err
}
使用方式
p:=person{
33,
"周杰伦",
175,
}
err=op.insert(&p)
if err != nil {
fmt.Println("插入出错",err)
}
更新操作,调用一次更新操作都是更新一行的。
//更新一行
func (operater *Operater) update() (error) {
collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
update:=person{
33,
"詹姆斯",
201,
}
err:=collcetion.Update(bson.M{"name": "周杰伦"},update)
if err !=nil {
fmt.Println(err)
}
return err
}
如果想更新所有可以使用UpdateAll()
方法。
查询操作
//统计集合中数据的个数
func (operater *Operater) query() ([]person,error) {
collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
p:=new(person)
p.AGE=33
query:=collcetion.Find(nil)
ps:=[]person{}
query.All(&ps)
iter:=collcetion.Find(nil).Iter()
//单个查询
result:=new(person)
for iter.Next(&result) {
fmt.Println("一个一个输出:", result)
}
return ps,nil
}
查询的参数可以是一个map或一个能够被bson编码的结构体。
该map的key和value可以是一般的interface{},例如bson.M。nil,相当于提供一个空document,如bson.m {}.
查询的结果展示有四个方法:One, For, Iter, or Tail
按照条件查询
func (operater *Operater) query() ([]person,error) {
collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
p:=new(person)
p.AGE=33
query:=collcetion.Find(bson.M{"age":21})
ps:=[]person{}
query.All(&ps)
fmt.Println(ps)
return ps,nil
}
上述方法会查询age =21 的结果集。
查询条件有一个bson ,什么是bson ??
里面有一个bson 的数据结构,bson 其实就是 Binary Serialized Document Format 二进制文件存储格式,类似于JSON,它和JSON一样,支持内嵌的文档对象和数组对象。
BSON可以做为网络数据交换的一种存储形式,这个有点类似于Google的Protocol Buffer,但是BSON是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想,
BSON有三个特点:轻量性、可遍历性、高效性。
MongoDB把BSON做为其数据的存储结构。为啥呢,一个重要的原因是BSON 可遍历。
条件查询带表达式
//条件查询
func (operater *Operater) query() ([]person,error) {
collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
p:=new(person)
p.AGE=33
query:=collcetion.Find(bson.M{"age":bson.M{"$eq":21}})
ps:=[]person{}
query.All(&ps)
fmt.Println(ps)
return ps,nil
}
其中$eq是 查询的操作符,查询的操作符文档直接参考:
https://docs.mongodb.com/manual/tutorial/query-documents/#read-operations-query-argument
删除操作
//单行删除
func (operater *Operater) delete(seletor interface{}) (error) {
collcetion:=operater.mogSession.DB(operater.dbname).C(operater.document)
return collcetion.Remove(seletor)
}
删除方法用法
err=op.delete(&bson.M{"height": 0})
if err!=nil {
fmt.Println("删除错误",err)
}else{
fmt.Println("删除成功")
}
数据结构体的定义,其中AGE NAME HEIGHT 名字的首字母必须大写,如果不无法与数据库字段名相对应。
type person struct {
AGE int
NAME string
HEIGHT int
}
如果名称不一致的解决方式
type person struct {
AGE int `bson:"age"`
NAME string `bson:"name"`
HEIGHT int `bson:"height"`
}
这一点很类似于orm的感觉
所有代码的github:
https://github.com/china-muwenbo/MyTestGo/blob/master/src/com.dylan.main/mongodb/mongoCurd.go
需要的直接下载运行。
BSON 的官方解释:https://www.mongodb.com/json-and-bson