mgo使用指南

Wesley13
• 阅读 603

mgo简介

mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API实现了丰富的特性,并经过良好测试。

官方网站:http://labix.org/mgo。

golang.tc(golangtc.com)网站的数据存储就是是用的MongoDB+mgo。近一年使用下来表现良好。

mgo使用指南 mgo使用指南 API文档

下面是mgo、mgo/bson、mgo/txn的在线文档。

  • mgo GoDoc GoWalker
  • mgo/bson GoDoc GoWalker
  • mgo/txn GoDoc GoWalker

mgo使用指南 mgo使用指南 安装

安装mgo之前请先安装Golang和MongoDB,安装过程不再赘述。

安装bzr版本工具(mgo使用Bazaar作为版本控制系统,因安装的时候需要去Bazaar拉取代码)。

安装命令

go get gopkg.in/mgo.v2

mgo使用指南 mgo使用指南 示例

下面的代码是个示例。

package main 
import ( "fmt" 
    "labix.org/v2/mgo" 
    "labix.org/v2/mgo/bson" 
) 
type Person struct 
{ 
    Name string 
    Phone string 
} 

func main() 
{ 
    session, err := mgo.Dial("") 
    if err != nil { panic(err) } 
    defer session.Close() 

    session.SetMode(mgo.Monotonic, true)
    c := session.DB("test").C("people") 
    err = c.Insert(&Person{"Ale", "111111"}, &Person{"Cla", "222222222"}) 
    if err != nil { panic(err) } 
    result := Person{} 
    err = c.Find(bson.M{"name": "Ale"}).One(&result) if err != nil { panic(err) } 
    fmt.Println("Phone:", result.Phone) 
 }

具体代码什么意思先不用管,后面讲解每个方法的用法。

mgo使用指南 mgo使用指南 如何使用

下面介绍如何使用mgo,主要介绍集合的操作。对数据库,用户等操作,请自行查看文档。

第一步当然是先导入mgo包

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

mgo使用指南 mgo使用指南 连接服务器

通过方法Dial()来和MongoDB服务器建立连接。Dial()定义如下:

func Dial(url string) (*Session, error)

具体使用:

session, err := mgo.Dial(url)

如果是本机,并且MongoDB是默认端口27017启动的话,下面几种方式都可以。

session, err := mgo.Dial("") 
session, err := mgo.Dial("localhost") 
session, err := mgo.Dial("127.0.0.1") 
session, err := mgo.Dial("localhost:27017")
session, err := mgo.Dial("127.0.0.1:27017")

如果不在本机或端口不同,传入相应的地址即可。如:

mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb

mgo使用指南 mgo使用指南 切换数据库

通过Session.DB()来切换相应的数据库。

func (s *Session) DB(name string) *Database

如切换到test数据库。

db := session.DB("test")

mgo使用指南 mgo使用指南 切换集合

通过Database.C()方法切换集合(Collection),这样我们就可以通过对集合进行增删查改操作了。

func (db *Database) C(name string) *Collection

如切换到`users`集合。

c := db.C("users")

mgo使用指南 mgo使用指南 对集合进行操作

介绍插入、查询、修改、删除操作。

先提一下ObjectId,MongoDB每个集合都会一个名为_id的主键,这是一个24位的16进制字符串。对应到mgo中就是bson.ObjectId。

这里我们定义一个struct,用来和集合对应。

type User struct 
{ 
Id_ bson.ObjectId `bson:"_id"` 
Name string `bson:"name"` 
Age int `bson:"age"` 
JonedAt time.Time `bson:"joned_at"` 
Interests []string `bson:"interests"` 
}

注解

注意User的字段首字母大写,不然不可见。通过bson:”name”这种方式可以定义MongoDB中集合的字段名,如果不定义,mgo自动把struct的字段名首字母小写作为集合的字段名。如果不需要获得id_,Id_可以不定义,在插入的时候会自动生成。

mgo使用指南 mgo使用指南 插入

插入方法定义如下:

func (c *Collection) Insert(docs ...interface{}) error

下面代码插入两条集合数据。

err = c.Insert(&User{ Id_: bson.NewObjectId(), 
                Name: "Jimmy Kuu", 
                Age: 33, 
                JoinedAt: time.Now(),
                Interests: []string{"Develop", "Movie"}, }
                ) 
if err != nil { 
    panic(err) 
} 
err = c.Insert(&User{ Id_: bson.NewObjectId(), 
                Name: "Tracy Yu", 
                Age: 31, 
                JoinedAt: time.Now(), 
                Interests: []string{"Shoping", "TV"}, }
                ) 
if err != nil { 
    panic(err) 
}

这里通过bson.NewObjectId()来创建新的ObjectId,如果创建完需要用到的话,放在一个变量中即可,一般在Web开发中可以作为参数跳转到其他页面。

通过MongoDB客户端可以发现,两条即可已经插入。

{ "_id" : ObjectId( "5204af979955496907000001" ), 
"name" : "Jimmy Kuu", 
"age" : 33, 
"joned_at" : Date( 1376038807950 ), 
"interests" : [ "Develop", "Movie" ] 
} 
{ "_id" : ObjectId( "5204af979955496907000002" ), 
"name" : "Tracy Yu", 
"age" : 31, 
"joned_at" : Date( 1376038807971 ),
"interests" : [ "Shoping", "TV" ] 
}

mgo使用指南 mgo使用指南 查询

通过func (c *Collection) Find(query interface{}) *Query来进行查询,返回的Query struct可以有附加各种条件来进行过滤。

通过Query.All()可以获得所有结果,通过Query.One()可以获得一个结果,注意如果没有数据或者数量超过一个,One()会报错。

条件用bson.M{key: value},注意key必须用MongoDB中的字段名,而不是struct的字段名。

mgo使用指南 mgo使用指南 无条件查询

查询所有

var users []User c.Find(nil).All(&users) fmt.Println(users)

上面代码可以把所有Users都查出来:

[{ObjectIdHex("5204af979955496907000001") Jimmy Kuu 33 2013-08-09 17:00:07.95 +0800 CST [Develop Movie]} {ObjectIdHex("5204af979955496907000002") Tracy Yu 31 2013-08-09 17:00:07.971 +0800 CST [Shoping TV]}]
mgo使用指南 mgo使用指南 根据ObjectId查询
id := "5204af979955496907000001" objectId := bson.ObjectIdHex(id) user := new(User) c.Find(bson.M{"_id": objectId}).One(&user) fmt.Println(user)

结果如下:

&{ObjectIdHex("5204af979955496907000001") Jimmy Kuu 33 2013-08-09 17:00:07.95 +0800 CST [Develop Movie]}

更简单的方式是直接用FindId()方法:

c.FindId(objectId).One(&user)

注解

注意这里没有处理err。当找不到的时候用One()方法会出错。

mgo使用指南 mgo使用指南 单条件查询

=($eq)

c.Find(bson.M{"name": "Jimmy Kuu"}).All(&users)

!=($ne)

c.Find(bson.M{"name": bson.M{"$ne": "Jimmy Kuu"}}).All(&users)

>($gt)

c.Find(bson.M{"age": bson.M{"$gt": 32}}).All(&users)

<($lt)

c.Find(bson.M{"age": bson.M{"$lt": 32}}).All(&users)

>=($gte)

c.Find(bson.M{"age": bson.M{"$gte": 33}}).All(&users)

<=($lte)

c.Find(bson.M{"age": bson.M{"$lte": 31}}).All(&users)

in($in)

c.Find(bson.M{"name": bson.M{"$in": []string{"Jimmy Kuu", "Tracy Yu"}}}).All(&users)
mgo使用指南 mgo使用指南 多条件查询

and($and)

c.Find(bson.M{"name": "Jimmy Kuu", "age": 33}).All(&users)

or($or)

c.Find(bson.M{"$or": []bson.M{bson.M{"name": "Jimmy Kuu"}, bson.M{"age": 31}}}).All(&users)

mgo使用指南 mgo使用指南 修改

通过func (*Collection) Update来进行修改操作。

func (c *Collection) Update(selector interface{}, change interface{}) error

注意修改单个或多个字段需要通过$set操作符号,否则集合会被替换。

mgo使用指南 mgo使用指南 修改字段的值($set)
c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$set": bson.M{ "name": "Jimmy Gu", "age": 34, }})
mgo使用指南 mgo使用指南 inc($inc)

字段增加值

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$inc": bson.M{ "age": -1, }})
mgo使用指南 mgo使用指南 push($push)

从数组中增加一个元素

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$push": bson.M{ "interests": "Golang", }})
mgo使用指南 mgo使用指南 pull($pull)

从数组中删除一个元素

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$pull": bson.M{ "interests": "Golang", }})

mgo使用指南 mgo使用指南 删除

c.Remove(bson.M{"name": "Jimmy Kuu"})

注解

这里也支持多条件,参考多条件查询。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这