mog使用指南
mog使用指南
mgo简介
mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API实现了丰富的特性,并经过良好测试。
golang.tc(golangtc.com)网站的数据存储就是是用的MongoDB+mgo。近一年使用下来表现良好。
API文档
下面是mgo、mgo/bson、mgo/txn的在线文档。
mgo GoDoc GoWalker
mgo/bson GoDoc GoWalker
mgo/txn GoDoc GoWalker
安装
安装mgo之前请先安装Golang和MongoDB,安装过程不再赘述。
安装bzr版本工具(mgo使用Bazaar作为版本控制系统,因安装的时候需要去Bazaar拉取代码)。
安装命令
go get labix.org/v2/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()
// Optional. Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)
c := session.DB("test").C("people")
err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
    &Person{"Cla", "+55 53 8402 8510"})
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)
}
启动MongoDB,把上面代码复制了跑一下,如果输出下面内容,说明安装成功。
Phone: +55 53 8116 9639
具体代码什么意思先不用管,后面讲解每个方法的用法。
如何使用
下面介绍如何使用mgo,主要介绍集合的操作。对数据库,用户等操作,请自行查看文档。
第一步当然是先导入mgo包
import (
"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"
)
连接服务器
通过方法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
切换数据库
通过Session.DB()来切换相应的数据库。
func (s *Session) DB(name string) *Database
如切换到test数据库。
db := session.DB("test")
切换集合
通过Database.C()方法切换集合(Collection),这样我们就可以通过对集合进行增删查改操作了。
func (db *Database) C(name string) *Collection
如切换到users集合。
c := db.C("users")
对集合进行操作
介绍插入、查询、修改、删除操作。
先提一下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_可以不定义,在插入的时候会自动生成。
插入
插入方法定义如下:
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" ] }
查询
通过func (c *Collection) Find(query interface{}) *Query来进行查询,返回的Query struct可以有附加各种条件来进行过滤。
通过Query.All()可以获得所有结果,通过Query.One()可以获得一个结果,注意如果没有数据或者数量超过一个,One()会报错。
条件用bson.M{key: value},注意key必须用MongoDB中的字段名,而不是struct的字段名。
无条件查询
查询所有
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]}]
根据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()方法会出错。
单条件查询
=($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)
多条件查询
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)
修改
通过func (*Collection) Update来进行修改操作。
func (c *Collection) Update(selector interface{}, change interface{}) error
注意修改单个或多个字段需要通过$set操作符号,否则集合会被替换。
修改字段的值($set)
c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
    bson.M{"$set": bson.M{
        "name": "Jimmy Gu",
        "age":  34,
    }})
inc($inc)
字段增加值
c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
    bson.M{"$inc": bson.M{
        "age": -1,
    }})
push($push)
从数组中增加一个元素
c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
    bson.M{"$push": bson.M{
        "interests": "Golang",
    }})
pull($pull)
从数组中删除一个元素
c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
    bson.M{"$pull": bson.M{
        "interests": "Golang",
    }})
删除
c.Remove(bson.M{"name": "Jimmy Kuu"})
注解
这里也支持多条件,参考多条件查询。
mog使用指南的更多相关文章
- JavaScript权威指南 - 函数
		函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ... 
- UE4新手之编程指南
		虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ... 
- JavaScript权威指南 - 对象
		JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ... 
- JavaScript权威指南 - 数组
		JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ... 
- const extern static 终极指南
		const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ... 
- Atitit.研发管理软件公司的软资产列表指南
		Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ... 
- HA 高可用软件系统保养指南
		又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ... 
- 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南
		欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ... 
- Visual Studio Code 配置指南
		Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.在我看来它是「一款完美的编辑器」. 本文是有关 VS Code 的特性介绍与配置指 ... 
随机推荐
- java 实现Excel压缩成Zip导出
			1 概述 在web项目中常见的一种场景就是将文件导出为Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目的友好交互性以及易用性,那么怎么才能优雅的解决这个问题呢?笔者今 ... 
- trove显示更多flavor信息
			https://review.openstack.org/#/c/352786/12 这是我目前提交的commit,如果想添加新的flavor信息可以参考这个,有几个需要注意的点是在跑py27的时候, ... 
- Redis的安装和使用之------Redis相关运用
			原文 http://wangzhijian.blog.51cto.com/6427016/1731962 一.简介 REmote DIctionary Server(Redis) 是一个由 Salv ... 
- kafka服务安装-SuSE Linux Enterprise Server 11 SP3
			kafka是一款分布式消息发布和订阅的系统,具有高性能和高吞吐率. 更多说明请自行了解,直接进入主题. kakfa 安装之前需要安装jdk,不做更多说明 一.下载kafka 进入下载页面:http: ... 
- Linux 复习重点目录
			Linux安全复习 一.Linux基本命令 1.文件管理命令 lvm 2.用户管理命令 3.网络管理命令 4.权限管理 普通权限和特殊权限 权限命令修改 5.服务命令 6.软件安装管理命令 yum安装 ... 
- ASP.NET MVC Url中带点号出现404错误的解决方案
			由于项目需求,项目的路由设计如下 config.Routes.MapHttpRoute( name: "Get/Put Sku", routeTemplate: "api ... 
- 关于Container With Most Water的求解
			Container With Most Water 哎,最近心情烦躁,想在leetcode找找感觉,就看到了这题. 然而,看了题目半天,硬是没看懂,于是乎就百度了下,怕看到解题方法,就略看了下摘要,以 ... 
- EasyCHM(CHM电子书制作工具) v3.84.545 绿色版
			软件名称:EasyCHM(CHM电子书制作工具) v3.84.545 绿色版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 2.78MB 图片预览: 软件 ... 
- 【python标准库】内建函数
			abs(x) 返回一个数的绝对值.参数可以是普通的整数,长整数或者浮点数.如果参数是个复数,返回它的模. all(iterable) 如果iterable的所有元素为真(或者iterable为空), ... 
- 敏捷开发(十一)- Scrum Sprint评审会议
			本文主要是为了检测你对SCRUM 评审会议的了解和使用程度, 通过本文你可以检测一下 1.你们的SCRUM 评审会议的过程和步骤 2.SCRUM 评审会议的输出结果一.会议目的 ... 
