package main
import (
"fmt"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
"strconv"
"time"
)
var CurrentMongoClient MongoClient
type MongoClient struct {
session *mgo.Session
}
type Database struct {
Host string `toml:"Host"`
Name string `toml:"Name"`
Port int `toml:"Port"`
Type string `toml:"Type"`
Timeout int64 `toml:"Timeout"`
}
// 首字母大写,不然不能写入数据库
type User struct {
// 若不手动指定,mongo 将自动生成
Id bson.ObjectId `bson:"_id,omitempty"` // omitempty:若为空,则不写入mongo
Name string `bson:"name"`
Age int `bson:"age"`
Birthday time.Time `bson:"birthday"`
}
func NewClient(DBInfo Database) (MongoClient, error) {
connectString := DBInfo.Host + ":" + strconv.Itoa(DBInfo.Port)
mongoDillInfo := mgo.DialInfo{
Addrs: []string{connectString},
Timeout: time.Duration(DBInfo.Timeout) * time.Millisecond,
Database: DBInfo.Name,
}
session, err := mgo.DialWithInfo(&mongoDillInfo)
if err != nil {
return MongoClient{}, err
}
CurrentMongoClient.session = session
return CurrentMongoClient, nil
}
func (m *MongoClient) CloseSession() {
if m.session == nil {
m.session.Close()
}
}
func (m *MongoClient) GetSessionCopy() *mgo.Session {
return m.session.Copy()
}
func main() {
dbName, collectionName := "test", "mongo"
mongoDillInfo := mgo.DialInfo{
Addrs: []string{"192.168.1.2:27017"},
Timeout: time.Duration(500) * time.Millisecond,
Database: DBInfo.Name,
Username: DBInfo.Username,
Password: DBInfo.Password,
}
session, err := mgo.DialWithInfo(&mongoDillInfo)
if err != nil {
panic(err)
}
coll := session.DB(dbName).C(collectionName)
id := bson.NewObjectId()
idStr := id.Hex()
// 插入数据
user := User{
Id: id,
Name: "test",
Age: 12,
Birthday: time.Now(),
}
coll.Insert(user)
// 查询 id = 10
firstUser := User{}
coll.FindId(bson.ObjectIdHex(idStr)).One(&firstUser)
fmt.Println("firstUser: ", firstUser)
// 查询 age > 10
var findUser []User
coll.Find(bson.M{"age": bson.M{"$gt": 10}}).All(&findUser)
fmt.Println("findUser: ",findUser)
// 修改
coll.UpdateId(bson.ObjectIdHex(idStr), bson.M{"$set":bson.M{"name": "update"}})
// 删除全部数据
coll.RemoveAll(nil)
}
字段
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"`
}
MongoDB每个集合都会一个名为_id的主键,这是一个24位的16进制字符串。对应到mgo中就是bson.ObjectId。 :::tips 注意: User的字段首字母大写,不然不可见。 :::
插入
插入方法定义如下:
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)
}
查询
func (c Collection) Find(query interface{}) Query
*Query来返回的Query struct可以有附加各种条件来进行过滤。
通过Query.All()可以获得所有结果,通过Query.One()可以获得一个结果,
:::tips
注意: 如果没有数据或者数量超过一个,One()会报错。
:::
条件用bson.M{key: value},注意key必须用MongoDB中的字段名,而不是struct的字段名。
无条件查询
查询所有
var users []User
c.Find(nil).All(&users)
上面代码可以把所有Users都查出来:
根据ObjectId查询
id := "5204af979955496907000001"
objectId := bson.ObjectIdHex(id)
user := new(User)
c.Find(bson.M{"_id": objectId}).One(&user) 或
c.FindId(objectId).One(&user)
单条件查询
=($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”})