1. package main
  2. import (
  3. "fmt"
  4. "github.com/globalsign/mgo"
  5. "github.com/globalsign/mgo/bson"
  6. "strconv"
  7. "time"
  8. )
  9. var CurrentMongoClient MongoClient
  10. type MongoClient struct {
  11. session *mgo.Session
  12. }
  13. type Database struct {
  14. Host string `toml:"Host"`
  15. Name string `toml:"Name"`
  16. Port int `toml:"Port"`
  17. Type string `toml:"Type"`
  18. Timeout int64 `toml:"Timeout"`
  19. }
  20. // 首字母大写,不然不能写入数据库
  21. type User struct {
  22. // 若不手动指定,mongo 将自动生成
  23. Id bson.ObjectId `bson:"_id,omitempty"` // omitempty:若为空,则不写入mongo
  24. Name string `bson:"name"`
  25. Age int `bson:"age"`
  26. Birthday time.Time `bson:"birthday"`
  27. }
  28. func NewClient(DBInfo Database) (MongoClient, error) {
  29. connectString := DBInfo.Host + ":" + strconv.Itoa(DBInfo.Port)
  30. mongoDillInfo := mgo.DialInfo{
  31. Addrs: []string{connectString},
  32. Timeout: time.Duration(DBInfo.Timeout) * time.Millisecond,
  33. Database: DBInfo.Name,
  34. }
  35. session, err := mgo.DialWithInfo(&mongoDillInfo)
  36. if err != nil {
  37. return MongoClient{}, err
  38. }
  39. CurrentMongoClient.session = session
  40. return CurrentMongoClient, nil
  41. }
  42. func (m *MongoClient) CloseSession() {
  43. if m.session == nil {
  44. m.session.Close()
  45. }
  46. }
  47. func (m *MongoClient) GetSessionCopy() *mgo.Session {
  48. return m.session.Copy()
  49. }
  50. func main() {
  51. dbName, collectionName := "test", "mongo"
  52. mongoDillInfo := mgo.DialInfo{
  53. Addrs: []string{"192.168.1.2:27017"},
  54. Timeout: time.Duration(500) * time.Millisecond,
  55. Database: DBInfo.Name,
  56. Username: DBInfo.Username,
  57. Password: DBInfo.Password,
  58. }
  59. session, err := mgo.DialWithInfo(&mongoDillInfo)
  60. if err != nil {
  61. panic(err)
  62. }
  63. coll := session.DB(dbName).C(collectionName)
  64. id := bson.NewObjectId()
  65. idStr := id.Hex()
  66. // 插入数据
  67. user := User{
  68. Id: id,
  69. Name: "test",
  70. Age: 12,
  71. Birthday: time.Now(),
  72. }
  73. coll.Insert(user)
  74. // 查询 id = 10
  75. firstUser := User{}
  76. coll.FindId(bson.ObjectIdHex(idStr)).One(&firstUser)
  77. fmt.Println("firstUser: ", firstUser)
  78. // 查询 age > 10
  79. var findUser []User
  80. coll.Find(bson.M{"age": bson.M{"$gt": 10}}).All(&findUser)
  81. fmt.Println("findUser: ",findUser)
  82. // 修改
  83. coll.UpdateId(bson.ObjectIdHex(idStr), bson.M{"$set":bson.M{"name": "update"}})
  84. // 删除全部数据
  85. coll.RemoveAll(nil)
  86. }

字段

  1. type User struct {
  2. Id bson.ObjectId `bson:"_id"`
  3. Name string `bson:"name"`
  4. Age int `bson:"age"`
  5. JonedAt time.Time `bson:"joned_at"`
  6. Interests []string `bson:"interests"`
  7. }

MongoDB每个集合都会一个名为_id的主键,这是一个24位的16进制字符串。对应到mgo中就是bson.ObjectId。 :::tips 注意: User的字段首字母大写,不然不可见。 :::

插入

插入方法定义如下:

func (c *Collection) Insert(docs …interface{}) error

下面代码插入两条集合数据。

  1. err = c.Insert(&User{
  2. Id_: bson.NewObjectId(),
  3. Name: "Jimmy Kuu",
  4. Age: 33,
  5. JoinedAt: time.Now(),
  6. Interests: []string{"Develop", "Movie"},
  7. })
  8. if err != nil {
  9. panic(err)
  10. }

查询

func (c Collection) Find(query interface{}) Query

*Query来返回的Query struct可以有附加各种条件来进行过滤。
通过Query.All()可以获得所有结果,通过Query.One()可以获得一个结果, :::tips 注意: 如果没有数据或者数量超过一个,One()会报错。 ::: 条件用bson.M{key: value},注意key必须用MongoDB中的字段名,而不是struct的字段名。

无条件查询

查询所有

  1. var users []User
  2. c.Find(nil).All(&users)

上面代码可以把所有Users都查出来:

根据ObjectId查询

  1. id := "5204af979955496907000001"
  2. objectId := bson.ObjectIdHex(id)
  3. user := new(User)
  4. c.Find(bson.M{"_id": objectId}).One(&user)
  5. 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)
  1. c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
  2. bson.M{"$set": bson.M{
  3. "name": "Jimmy Gu",
  4. "age": 34,
  5. }})

inc($inc)

字段增加值

  1. c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
  2. bson.M{"$inc": bson.M{
  3. "age": -1,
  4. }})

push($push)

从数组中增加一个元素

  1. c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
  2. bson.M{"$push": bson.M{
  3. "interests": "Golang",
  4. }})

pull($pull)

从数组中删除一个元素

  1. c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
  2. bson.M{"$pull": bson.M{
  3. "interests": "Golang",
  4. }})

删除

c.Remove(bson.M{“name”: “Jimmy Kuu”})