以下所有例子中结构定义如下:
1
2
3
4
5
6
7
8
|
type User struct {
Id_ bson.ObjectId `bson: "_id" `
Name string `bson: "name" `
Age int `bson: "age" `
JoinedAt time . Time `bson: "joined_at" `
Interests []string `bson: "interests" `
Num [] int `bson: "num" `
}
|
1、查询
通过func (c *Collection) Find(query interface{}) *Query来进行查询,返回的Query struct可以有附加各种条件来进行过滤。
通过Query.All()可以获得所有结果,通过Query.One()可以获得一个结果,注意如果没有数据或者数量超过一个,One()会报错。
条件用bson.M{key: value},注意key必须用MongoDB中的字段名,而不是struct的字段名。
1.1、查询所有
1
2
|
var users [] User
c.Find(nil). All (&users)
|
上面代码可以把所有Users都查出来:
1.2、根据ObjectId查询
1
2
3
4
|
id := "5204af979955496907000001"
objectId := bson.ObjectIdHex(id)
user := new( User )
c.Find(bson.M{ "_id" : objectId}).One(& user )
|
更简单的方式是直接用FindId()方法:
1
|
c.FindId(objectId).One(& user )
|
注意这里没有处理err。当找不到的时候用One()方法会出错。
1.3、单条件查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
=($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)
|
1.4、多条件查询
1
2
3
4
|
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)
|
2、修改
通过func (*Collection) Update来进行修改操作。
1
|
func (c *Collection) Update (selector interface{}, change interface{}) error
|
注意修改单个或多个字段需要通过$set操作符号,否则集合会被替换。
2.1、($set)
1
2
3
4
5
|
//修改字段的值
c. Update (
bson.M{ "_id" : bson.ObjectIdHex( "5204af979955496907000001" )},
bson.M{ "$set" : bson.M{ "name" : "Jimmy Gu" , "age" : 34 }}
)
|
2.2、inc($inc)
1
2
3
4
5
6
7
8
9
|
//字段增加值
c. Update (
bson.M{ "_id" : bson.ObjectIdHex( "5204af979955496907000001" )},
bson.M{ "$inc" : bson.M{ "age" : -1 }}
)
//字段Num数组第三个数增加值
c. Update (
bson.M{ "_id" : bson.ObjectIdHex( "5204af979955496907000001" )},
bson.M{ "$inc" : bson.M{ "Num." + strconv.Itoa(2): 1 }})
|
2.3、push($push)
1
2
3
4
5
|
//从数组中增加一个元素
c. Update (
bson.M{ "_id" : bson.ObjectIdHex( "5204af979955496907000001" )},
bson.M{ "$push" : bson.M{ "interests" : "Golang" }}
)
|
2.4、pull($pull)
1
2
3
4
5
|
//从数组中删除一个元素
c. Update (
bson.M{ "_id" : bson.ObjectIdHex( "5204af979955496907000001" )},
bson.M{ "$pull" : bson.M{ "interests" : "Golang" }}
)
|
2.5、删除
1
|
c.Remove(bson.M{ "name" : "Jimmy Kuu" })
|
补充:golang mongodb查找find demo
使用gopkg.in/mgo.v2库操作,插入操作主要使用mongodb中Collection对象的Find方法,函数原型:
1
|
func (c *Collection) Find(query interface{}) *Query
|
查找的时候Find的参数都会用bson.M类型
1
|
type M map[string]interface{}
|
例如:bson.M{"name": "Tom"}相当直接mongodb的查询条件{"name": "Tom"}
统一封装下getDB方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package main
import (
"fmt"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
// get mongodb db
func getDB() *mgo. Database {
session, err := mgo.Dial( "172.16.27.134:10001" )
if err != nil {
panic(err)
}
session.SetMode(mgo.Monotonic, true )
db := session.DB( "test" )
return db
}
|
查找单条记录
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
|
func findOne() {
db := getDB()
c := db.C( "user" )
// 用struct接收,一般情况下都会这样处理
type User struct {
Name string "bson:`name`"
Age int "bson:`age`"
}
user := User {}
err := c.Find(bson.M{ "name" : "Tom" }).One(& user )
if err != nil {
panic(err)
}
fmt.Println( user )
// output : {Tom 20}
// 用bson.M结构接收,当你不了解返回的数据结构格式时,可以用这个先查看,然后再定义struct格式
// 在处理mongodb组合查询时,经常这么干
result := bson.M{}
err = c.Find(nil).One(&result)
if err != nil {
panic(err)
}
fmt.Println(result)
// output : map[_id:ObjectIdHex( "56fdce98189df8759fd61e5b" ) name :Tom age:20]
}
|
查找多条记录
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
|
func findMuit() {
db := getDB()
c := db.C( "user" )
// 使用 All 方法,一次性消耗较多内存,如果数据较多,可以考虑使用迭代器
type User struct {
Id bson.ObjectId `bson: "_id,omitempty" `
Name string "bson:`name`"
Age int "bson:`age`"
}
var users [] User
err := c.Find(nil). All (&users)
if err != nil {
panic(err)
}
fmt.Println(users)
// output : [{ObjectIdHex( "56fdce98189df8759fd61e5b" ) Tom 20}...]
// 使用迭代器获取数据可以避免一次占用较大内存
var user User
iter := c.Find(nil).Iter()
for iter. Next (& user ) {
fmt.Println( user )
}
// output :
// {ObjectIdHex( "56fdce98189df8759fd61e5b" ) Tom 20}
// {ObjectIdHex( "56fdce98189df8759fd61e5c" ) Tom 20}
// ...
}
|
查找指定字段
主要使用Select函数:
1
|
func (q *Query) Select (selector interface{}) *Query
|
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
|
func findField() {
db := getDB()
c := db.C( "user" )
// 只读取 name 字段
type User struct {
Name string "bson:`name`"
}
var users [] User
err := c.Find(bson.M{}). Select (bson.M{ "name" : 1 }). All (&users)
if err != nil {
panic(err)
}
fmt.Println(users)
// output : [{Tom} {Tom} {Anny}...]
// 只排除_id字段
type User2 struct {
Name string "bson:`name`"
Age int "bson:`age`"
}
var users2 []User2
err = c.Find(bson.M{}). Select (bson.M{ "_id" : 0 }). All (&users2)
if err != nil {
panic(err)
}
fmt.Println(users2)
// output : [{Tom 20} {Tom 20} {Anny 28}...]
}
|
查询嵌套格式数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
func findNesting() {
db := getDB()
c := db.C( "user" )
// 使用嵌套的struct接收数据
type User struct {
Name string "bson:`name`"
Age int "bson:`age`"
Toys []struct {
Name string "bson:`name`"
}
}
var users User
// 只查询toys字段存在的
err := c.Find(bson.M{ "toys" : bson.M{ "$exists" : true }}).One(&users)
if err != nil {
panic(err)
}
fmt.Println(users)
// output : {Tom 20 [{dog}]}
}
|
查找数据总数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
func count () {
db := getDB()
c := db.C( "user" )
// 查找表总数
count , err := c. Count ()
if err != nil {
panic(err)
}
fmt.Println( count )
// output : 8
// 结合find条件查找
count , err = c.Find(bson.M{ "name" : "Tom" }). Count ()
if err != nil {
panic(err)
}
fmt.Println( count )
// output : 6
}
|
对数据进行排序
使用Sort函数
1
|
func (q *Query) Sort(fields ...string) *Query
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
func findSort() {
db := getDB()
c := db.C( "user" )
type User struct {
Id bson.ObjectId `bson: "_id,omitempty" `
Name string "bson:`name`"
Age int "bson:`age`"
}
var users [] User
// 按照age字段降序排列,如果升序去掉横线 "-" 就可以了
err := c.Find(nil).Sort( "-age" ). All (&users)
if err != nil {
panic(err)
}
fmt.Println(users)
// output :
// [{ObjectIdHex( "56fdce98189df8759fd61e5d" ) Anny 28} ...]
// ...
}
|
分页查询
使用Skip函数和Limit函数
1
2
|
func (q *Query) Skip(n int ) *Query
func (q *Query) Limit(n int ) *Query
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
func findPage() {
db := getDB()
c := db.C( "user" )
type User struct {
Id bson.ObjectId `bson: "_id,omitempty" `
Name string "bson:`name`"
Age int "bson:`age`"
}
var users [] User
// 表示从偏移位置为2的地方开始取两条记录
err := c.Find(nil).Sort( "-age" ).Skip( 2 ).Limit( 2 ). All (&users)
if err != nil {
panic(err)
}
fmt.Println(users)
// output :
// [{ObjectIdHex( "56fdce98189df8759fd61e5d" ) Anny 20} ...]
// ...
}
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/Smicry/article/details/80640476