mog使用指南

mgo简介

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

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

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使用指南的更多相关文章

  1. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  2. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  3. JavaScript权威指南 - 对象

    JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...

  4. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  5. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  6. Atitit.研发管理软件公司的软资产列表指南

    Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...

  7. HA 高可用软件系统保养指南

    又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...

  8. 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南

    欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ...

  9. Visual Studio Code 配置指南

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.在我看来它是「一款完美的编辑器」. 本文是有关 VS Code 的特性介绍与配置指 ...

随机推荐

  1. java 实现Excel压缩成Zip导出

    1 概述 在web项目中常见的一种场景就是将文件导出为Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目的友好交互性以及易用性,那么怎么才能优雅的解决这个问题呢?笔者今 ...

  2. trove显示更多flavor信息

    https://review.openstack.org/#/c/352786/12 这是我目前提交的commit,如果想添加新的flavor信息可以参考这个,有几个需要注意的点是在跑py27的时候, ...

  3. Redis的安装和使用之------Redis相关运用

    原文  http://wangzhijian.blog.51cto.com/6427016/1731962 一.简介 REmote DIctionary Server(Redis) 是一个由 Salv ...

  4. kafka服务安装-SuSE Linux Enterprise Server 11 SP3

    kafka是一款分布式消息发布和订阅的系统,具有高性能和高吞吐率. 更多说明请自行了解,直接进入主题. kakfa 安装之前需要安装jdk,不做更多说明 一.下载kafka  进入下载页面:http: ...

  5. Linux 复习重点目录

    Linux安全复习 一.Linux基本命令 1.文件管理命令 lvm 2.用户管理命令 3.网络管理命令 4.权限管理 普通权限和特殊权限 权限命令修改 5.服务命令 6.软件安装管理命令 yum安装 ...

  6. ASP.NET MVC Url中带点号出现404错误的解决方案

    由于项目需求,项目的路由设计如下 config.Routes.MapHttpRoute( name: "Get/Put Sku", routeTemplate: "api ...

  7. 关于Container With Most Water的求解

    Container With Most Water 哎,最近心情烦躁,想在leetcode找找感觉,就看到了这题. 然而,看了题目半天,硬是没看懂,于是乎就百度了下,怕看到解题方法,就略看了下摘要,以 ...

  8. EasyCHM(CHM电子书制作工具) v3.84.545 绿色版

    软件名称:EasyCHM(CHM电子书制作工具) v3.84.545 绿色版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 2.78MB 图片预览: 软件 ...

  9. 【python标准库】内建函数

    abs(x) 返回一个数的绝对值.参数可以是普通的整数,长整数或者浮点数.如果参数是个复数,返回它的模. all(iterable) 如果iterable的所有元素为真(或者iterable为空), ...

  10. 敏捷开发(十一)- Scrum Sprint评审会议

    本文主要是为了检测你对SCRUM 评审会议的了解和使用程度, 通过本文你可以检测一下     1.你们的SCRUM 评审会议的过程和步骤    2.SCRUM 评审会议的输出结果一.会议目的     ...