在 Golang 中操作 MongoDB

除了 Redis,MongoDB 也是广泛使用的 NoSQL 数据库,甚至有人认为它会全面取代 MySQL。

与 Redis 面向键值存储不同,MongoDB 是面向 BSON 文档的。

虽然在操作方式上和传统 SQL 有些区别,但基本概念还是相似的,而且基于 JSON 的数据操作令开发者很舒服。

MongoDB 官方驱动还没有提供 Golang 支持,mgo 是目前几个开源项目中最出色的。

它不仅提供了基本的驱动,还提供两个子项目 mgo/bson 和 mgo/txn ,分别提供对 BSON 和多文档事务的支持。

MongoDB 的安装和初始化

OS X 、Ubuntu 下安装 MongoDB :

brew install mongodb
apt-get install mongodb

创建存放 DB 文件的目录:

mkdir -p /data/db/

通过 mongod 命令可启动 MongoDB 服务器,成功后通过 localhost:28017 可进入后台管理页面。

通过 mongo 命令可启动 MongoDB 客户端,执行 Mongo Shell :

安装 mgo 项目依赖

首先这个项目依赖 Canonical 的一个版本控制项目 Bazaar ,OS X 、Ubuntu 下安装 bzr :

brew install bzr
apt-get install bzr

安装 mgo 项目依赖:

go get labix.org/v2/mgo

Golang 中操作 MongoDB

首先定义数据结构:

type User struct {
	Name string
	Age int
}

连接 MongoDB 以获取 Session :

session, _ := mgo.Dial("localhost:27017")
defer session.Close()

选择 DB 和 Collection :

collection := session.DB("test").C("users")

插入数据:

collection.Insert(&User{"Adam", 14}, &User{"Bob", 19})

删除数据:

change, _ := collection.RemoveAll(bson.M{"age": bson.M{"$gte": 0}})
fmt.Printf("updated: %d, removed: %d.\n", change.Updated, change.Removed)

相当于执行以下 SQL 语句:

DELETE FROM user WHERE age >= 0;

修改数据:

collection.Update(bson.M{"name": "Adam"}, bson.M{"$set": bson.M{"age": 15}})

相当于执行以下 SQL 语句:

UPDATE user SET age = 15 WHERE name = 'Adam';

查询数据:

query := collection.Find(bson.M{"age": bson.M{"$gte": 10, "$lte": 50}}).Sort("name", "-age")

相当于执行以下 SQL 语句:

SELECT * FROM users WHERE age >= 10 && age <= 50 ORDER BY name ASC, age DESC;

遍历查询结果:

iter := query.Iter()
u := User{}
for iter.Next(&u) {
    	fmt.Printf("%s: %d\n", u.Name, u.Age)
}
iter.Close()

从上面可以发现,mgo 项目提供的 API 和 Mongo Shell 风格基本一致。

更多 API 可参考 mgo 项目 API 文档: