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"`
}
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
}
查找单条记录
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]
}
查找多条记录
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}
// ...
}
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} ...]
// ...
}