基本 CURD

概述

本章节介绍 mon 包的 CURD 相对复杂的方法介绍。

准备条件

  1. 完成 mon 的链接创建。
  2. 基本 CURD 学习。

新增

  1. InsertMany

    1. 函数签名:
    2. InsertMany func(ctx context.Context, documents []interface{}, opts ...*mopt.InsertManyOptions) (
    3. *mongo.InsertManyResult, error)
    4. 说明:
    5. 1. 新增多个文档记录。
    6. 入参:
    7. 1. ctx: context
    8. 2. documents: 记录信息
    9. 3. opts: 操作选项
    10. 返回值:
    11. 1. *mongo.InsertManyResult: 新增结果,包含新增记录的 _id 列表
    12. 2. error: 执行结果
    13. 示例:
    14. type User struct {
    15. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
    16. // TODO: Fill your own fields
    17. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
    18. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
    19. }
    20. func (m *defaultUserModel) InsertMany(ctx context.Context, data []*User) error {
    21. var docs = make([]interface{}, 0, len(data))
    22. for _, d := range data {
    23. if d.ID.IsZero() {
    24. d.ID = primitive.NewObjectID()
    25. d.CreateAt = time.Now()
    26. d.UpdateAt = time.Now()
    27. }
    28. docs = append(docs, d)
    29. }
    30. _, err := m.conn.InsertMany(ctx, docs)
    31. return err
    32. }
  2. BulkInserter

    1. 函数签名:
    2. NewBulkInserter(coll Collection, interval ...time.Duration) (*BulkInserter, error)
    3. 说明:
    4. 1. 如果存在大批量新增数据时,可以使用。
    5. 2. 插入过程会按 bulk(1000) 周期时间分组插入。
    6. 入参:
    7. 1. coll: mongo 连接对象
    8. 2. interval: 批量插入周期, intervals[0] 是有效值
    9. 返回值:
    10. 1. *BulkInserter: bulk 模块对象
    11. 2. error: 创建结果

示例: type User struct { ID primitive.ObjectID bson:"_id,omitempty" json:"id,omitempty" // TODO: Fill your own fields UpdateAt time.Time bson:"updateAt,omitempty" json:"updateAt,omitempty" CreateAt time.Time bson:"createAt,omitempty" json:"createAt,omitempty" }

// NewUserModel returns a model for the mongo. func NewUserModel(url, db, collection string) UserModel { conn := mon.MustNewModel(url, db, collection) blk, err := mon.NewBatchInserter(conn.Collection, time.Second) if err != nil { log.Fatal(err) }

  1. return &customUserModel{
  2. defaultUserModel: newDefaultUserModel(conn),
  3. blk: blk,
  4. }

}

func (m _customUserModel) BatchInsert(ctx context.Context, data []_User) error { m.blk.SetResultHandler(func(result *mongo.InsertManyResult, err error) { if err != nil { log.Println(err) } })

  1. for _, d := range data {
  2. if d.ID.IsZero() {
  3. d.ID = primitive.NewObjectID()
  4. d.CreateAt = time.Now()
  5. d.UpdateAt = time.Now()
  6. }
  7. m.blk.Insert(d)
  8. }
  9. m.blk.Flush()
  10. return nil

}

  1. ## 更新
  2. 1. <a href="https://github.com/zeromicro/go-zero/blob/master/core/stores/mon/collection.go#L111" target="_blank">UpdateOne</a>
  3. ```golang
  4. 函数签名:
  5. UpdateOne (ctx context.Context, filter, update interface{},
  6. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  7. 说明:
  8. 1. 更新单个文档记录。
  9. 入参:
  10. 1. ctx: context
  11. 2. filter: 过滤条件
  12. 3. update: 更新记录
  13. 4. opts: 操作选项
  14. 返回值:
  15. 1. *mongo.UpdateResult: 更新结果,包含更新的 _id, 匹配的数量等信息
  16. 2. error: 执行结果
  17. 示例:
  18. type User struct {
  19. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  20. // TODO: Fill your own fields
  21. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  22. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  23. }
  24. func (m *defaultUserModel) Update(ctx context.Context, data *User) error {
  25. data.UpdateAt = time.Now()
  26. _, err := m.conn.UpdateOne(ctx, bson.M{"_id": data.ID}, data)
  27. return err
  28. }
  29. ```
  30. 2. <a href="https://github.com/zeromicro/go-zero/blob/master/core/stores/mon/collection.go#L105" target="_blank">UpdateByID</a>
  31. ```golang
  32. 函数签名:
  33. UpdateByID (ctx context.Context, id, update interface{},
  34. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  35. 说明:
  36. 1. 通过 _id 更新单个文档记录。
  37. 入参:
  38. 1. ctx: context
  39. 2. id: _id
  40. 3. update: 更新记录
  41. 4. opts: 操作选项
  42. 返回值:
  43. 1. *mongo.UpdateResult: 更新结果,包含更新的 _id, 匹配的数量等信息
  44. 2. error: 执行结果
  45. 示例:
  46. type User struct {
  47. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  48. // TODO: Fill your own fields
  49. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  50. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  51. }
  52. func (m *defaultUserModel) Update(ctx context.Context, data *User) error {
  53. data.UpdateAt = time.Now()
  54. _, err := m.conn.UpdateByID(ctx, data.ID, data)
  55. return err
  56. }
  57. ```
  58. 3. <a href="https://github.com/zeromicro/go-zero/blob/master/core/stores/mon/collection.go#L108" target="_blank">UpdateMany</a>
  59. ```golang
  60. 函数签名:
  61. UpdateMany (ctx context.Context, filter, update interface{},
  62. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  63. 说明:
  64. 1. 更新多个文档记录。
  65. 入参:
  66. 1. ctx: context
  67. 2. filter: 过滤条件
  68. 3. update: 更新记录
  69. 4. opts: 操作选项
  70. 返回值:
  71. 1. *mongo.UpdateResult: 更新结果,包含更新的 _id 列表, 匹配的数量等信息
  72. 2. error: 执行结果
  73. 示例:
  74. type User struct {
  75. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  76. Name string `bson:"name,omitempty" json:"name,omitempty"`
  77. Age int `bson:"age,omitempty" json:"age,omitempty"`
  78. // TODO: Fill your own fields
  79. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  80. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  81. }
  82. func (m *customUserModel) UpdateAge(ctx context.Context, name string, age int) error {
  83. _, err := m.conn.UpdateMany(ctx, bson.M{"name": name}, bson.M{"$set": bson.M{"age": age}})
  84. return err
  85. }

查询

  1. FindOne

    1. 函数签名:
    2. FindOne func(ctx context.Context, v, filter interface{}, opts ...*mopt.FindOneOptions) error
    3. 说明:
    4. 1. 查询单个文档记录。
    5. 入参:
    6. 1. ctx: context
    7. 2. v: 查询结果
    8. 2. filter: 过滤条件
    9. 3. opts: 操作选项
    10. 返回值:
    11. 1. error: 执行结果
    12. 示例:
    13. type User struct {
    14. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
    15. // TODO: Fill your own fields
    16. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
    17. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
    18. }
    19. func (m *defaultUserModel) FindOne(ctx context.Context, id string) (*User, error) {
    20. oid, err := primitive.ObjectIDFromHex(id)
    21. if err != nil {
    22. return nil, ErrInvalidObjectId
    23. }
    24. var data User
    25. err = m.conn.FindOne(ctx, &data, bson.M{"_id": oid})
    26. switch err {
    27. case nil:
    28. return &data, nil
    29. case mon.ErrNotFound:
    30. return nil, ErrNotFound
    31. default:
    32. return nil, err
    33. }
    34. }
  2. Find

  1. 函数签名:
  2. Find func(ctx context.Context, v, filter interface{}, opts ...*mopt.FindOptions) error
  3. 说明:
  4. 1. 查询单个文档记录。
  5. 入参:
  6. 1. ctx: context
  7. 2. v: 查询结果(数组指针)
  8. 2. filter: 过滤条件
  9. 3. opts: 操作选项
  10. 返回值:
  11. 1. error: 执行结果
  12. 示例:
  13. type User struct {
  14. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  15. // TODO: Fill your own fields
  16. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  17. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  18. }
  19. func (m *defaultUserModel) Find(ctx context.Context, id string) ([]*User, error) {
  20. oid, err := primitive.ObjectIDFromHex(id)
  21. if err != nil {
  22. return nil, ErrInvalidObjectId
  23. }
  24. var data []*User
  25. err = m.conn.Find(ctx, &data, bson.M{"_id": oid})
  26. return data, nil
  27. }

删除

  1. DeleteOne

    1. 函数签名:
    2. DeleteOne func(ctx context.Context, filter interface{}, opts ...*mopt.DeleteOptions) (int64, error)
    3. 说明:
    4. 1. 新增单个文档记录。
    5. 入参:
    6. 1. ctx: context
    7. 2. filter: 过滤条件
    8. 3. opts: 操作选项
    9. 返回值:
    10. 1. int64: 删除数量
    11. 2. error: 执行结果
    12. 示例:
    13. type User struct {
    14. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
    15. // TODO: Fill your own fields
    16. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
    17. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
    18. }
    19. func (m *defaultUserModel) Delete(ctx context.Context, id string) error {
    20. oid, err := primitive.ObjectIDFromHex(id)
    21. if err != nil {
    22. return ErrInvalidObjectId
    23. }
    24. _, err = m.conn.DeleteOne(ctx, bson.M{"_id": oid})
    25. return err
    26. }
  2. DeleteMany

    1. 函数签名:
    2. DeleteMany func(ctx context.Context, filter interface{}, opts ...*mopt.DeleteOptions) (
    3. *mongo.DeleteResult, error)
    4. 说明:
    5. 1. 新增单个文档记录。
    6. 入参:
    7. 1. ctx: context
    8. 2. filter: 过滤条件
    9. 3. opts: 操作选项
    10. 返回值:
    11. 1. *mongo.DeleteResult: 删除结果
    12. 2. error: 执行结果
    13. 示例:
    14. type User struct {
    15. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
    16. // TODO: Fill your own fields
    17. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
    18. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
    19. }
    20. func (m *defaultUserModel) Delete(ctx context.Context, id string) error {
    21. oid, err := primitive.ObjectIDFromHex(id)
    22. if err != nil {
    23. return ErrInvalidObjectId
    24. }
    25. _, err = m.conn.DeleteMany(ctx, bson.M{"_id": oid})
    26. return err
    27. }