Golang连接MongoDB数据库

目前go支持MongoDB最好的驱动就是mgo。

下载与引用

1
2
3
go get gopkg.in/mgo.v2
import "gopkg.in/mgo.v2"
1
2
3
go get labix.org/v2/mgo
import "labix.org/v2/mgo"

安装时发现,地址 labix.org/v2/mgo 中的mgo版本中有些方法不全,而地址 gopkg.in/mgo.v2中的方法是全的,但是该地址下载超时而失败,必须翻墙才可以访问。
labix.org/v2/mgo 中就没有 mongo, err := mgo.ParseURL(MongoDBUrl)ParseURL() 方法。

如果无法翻墙,还可以从 github 下载:

因为我们要使用 mgo 的 v2 版本,所以需要迁出 branch:v2 分支,不能直接使用 master 分支。

go get 命令后添加 -d 参数可以只下载而不会执行安装命令。

操作步骤为:

  1. 执行命令 go get -d github.com/go-mgo/mgo
  2. 找到上面 clone 的目录,迁出分支 v2
  3. 再次运行 go get 命令,这时会在迁出的分支上执行命令
1
2
3
4
5
go get -d github.com/go-mgo/mgo
git checkout v2
go get github.com/go-mgo/mgo

安装bzr工具

Bazaar是一款开源的分布式版本控制工具。

安装mgo之前,需要先安装 bzr 工具,否则直接执行或报错:

1
2
3
> go get labix.org/v2/mgo
go: missing Bazaar command. See https://golang.org/s/gogetcmd
package labix.org/v2/mgo: exec: "bzr": executable file not found in %PATH%
Win

从网址 http://bazaar.canonical.com/en/ 下载安装包,选择 Standalone版本或其他版本。

Ubuntu

sudo apt-get install bzr


连接字符串

1
2
3
4
MONGODB_URL="mongodb://user:pass@server.compose.io/db_name"
mongodb://localhost:27017/articles_demo_dev
mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb

或者:

1
2
3
4
5
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")

创建连接

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

1
db := session.DB("xtest") //数据库名称

通过Database.C()方法切换集合(Collection):

1
collection := db.C("xtest") // 集合名称

或直接一步:

1
c := session.DB("xtest").C("xtest")

查询

通过func (c Collection) Find(query interface{}) Query来进行查询
通过Query.All()可以获得所有结果
通过Query.One()可以获得一个结果
条件用 bson.M{key: value} ,注意key必须用MongoDB中的字段名,而不是struct的字段名。


示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package main
import (
"fmt"
"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"
)
const (
MONGODB_URL = "127.0.0.1:27017"
)
func main() {
//创建连接
session, err := mgo.Dial(MONGODB_URL)
if err != nil {
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
// db := session.DB("xtest") //数据库名称
// collection := db.C("xtest") // 集合名称
c := session.DB("xtest").C("xtest")
// //插入数据
// err = c.Insert(&Person{"Tommy", "123456"}, &Person{"Hanleilei", "98765"},
// &Person{"喜洋洋", "98765"}, &Person{"灰太狼", "46577"},
// )
// if err != nil {
// panic(err)
// }
// //查询并赋值 Find().One()
// result := Person{}
// err = c.Find(bson.M{"name": "Tommy"}).One(&result)
// if err != nil {
// panic(err)
// }
// //输出
// fmt.Println("Phone ", result.Phone)
// //集合中元素数量 Count()
// countNum, err := c.Count()
// fmt.Println("obj numbers ", countNum)
// //查询多条数据 Find().Iter()
// var onep = Person{}
// iter := c.Find(nil).Iter()
// for iter.Next(&onep) {
// fmt.Println("姓名 ", onep.Name)
// }
// //查询多条数据 Find().All()
// var personAll []Person
// err = c.Find(nil).All(&personAll)
// for i := 0; i < len(personAll); i++ {
// fmt.Println("Person ", personAll[i].Name, personAll[i].Phone)
// }
// //更新数据 Update()
// abc := Person{}
// err = c.Find(bson.M{"name": "Tommy"}).One(&abc)
// fmt.Println("Tommy phone is ", abc.Phone)
// err = c.Update(bson.M{"name": "Tommy"}, bson.M{"$set": bson.M{"phone": "10086"}})
// err = c.Find(bson.M{"name": "Tommy"}).One(&abc)
// fmt.Println("Tommy phone is ", abc.Phone)
// //删除数据 Remove()
// fmt.Println(c.Count())
// err = c.Remove(bson.M{"phone": "46577"})
// fmt.Println(c.Count())
fmt.Println("end")
}
type Person struct {
Name string `bson:"name"`
Phone string `bson:"phone"`
}

相关

坚持原创技术分享,您的支持将鼓励我继续创作!
如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc