基本 CURD
概述
本章节介绍 mon 包的 CURD 相对复杂的方法介绍。
准备条件
新增
-
函数签名:InsertMany func(ctx context.Context, documents []interface{}, opts ...*mopt.InsertManyOptions) (*mongo.InsertManyResult, error)说明:1. 新增多个文档记录。入参:1. ctx: context2. documents: 记录信息3. opts: 操作选项返回值:1. *mongo.InsertManyResult: 新增结果,包含新增记录的 _id 列表2. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *defaultUserModel) InsertMany(ctx context.Context, data []*User) error {var docs = make([]interface{}, 0, len(data))for _, d := range data {if d.ID.IsZero() {d.ID = primitive.NewObjectID()d.CreateAt = time.Now()d.UpdateAt = time.Now()}docs = append(docs, d)}_, err := m.conn.InsertMany(ctx, docs)return err}
-
函数签名:NewBulkInserter(coll Collection, interval ...time.Duration) (*BulkInserter, error)说明:1. 如果存在大批量新增数据时,可以使用。2. 插入过程会按 bulk(1000) 或 周期时间分组插入。入参:1. coll: mongo 连接对象2. interval: 批量插入周期, intervals[0] 是有效值返回值:1. *BulkInserter: bulk 模块对象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) }
return &customUserModel{defaultUserModel: newDefaultUserModel(conn),blk: blk,}
}
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) } })
for _, d := range data {if d.ID.IsZero() {d.ID = primitive.NewObjectID()d.CreateAt = time.Now()d.UpdateAt = time.Now()}m.blk.Insert(d)}m.blk.Flush()return nil
}
## 更新1. <a href="https://github.com/zeromicro/go-zero/blob/master/core/stores/mon/collection.go#L111" target="_blank">UpdateOne</a>```golang函数签名:UpdateOne (ctx context.Context, filter, update interface{},opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)说明:1. 更新单个文档记录。入参:1. ctx: context2. filter: 过滤条件3. update: 更新记录4. opts: 操作选项返回值:1. *mongo.UpdateResult: 更新结果,包含更新的 _id, 匹配的数量等信息2. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *defaultUserModel) Update(ctx context.Context, data *User) error {data.UpdateAt = time.Now()_, err := m.conn.UpdateOne(ctx, bson.M{"_id": data.ID}, data)return err}```2. <a href="https://github.com/zeromicro/go-zero/blob/master/core/stores/mon/collection.go#L105" target="_blank">UpdateByID</a>```golang函数签名:UpdateByID (ctx context.Context, id, update interface{},opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)说明:1. 通过 _id 更新单个文档记录。入参:1. ctx: context2. id: _id3. update: 更新记录4. opts: 操作选项返回值:1. *mongo.UpdateResult: 更新结果,包含更新的 _id, 匹配的数量等信息2. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *defaultUserModel) Update(ctx context.Context, data *User) error {data.UpdateAt = time.Now()_, err := m.conn.UpdateByID(ctx, data.ID, data)return err}```3. <a href="https://github.com/zeromicro/go-zero/blob/master/core/stores/mon/collection.go#L108" target="_blank">UpdateMany</a>```golang函数签名:UpdateMany (ctx context.Context, filter, update interface{},opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)说明:1. 更新多个文档记录。入参:1. ctx: context2. filter: 过滤条件3. update: 更新记录4. opts: 操作选项返回值:1. *mongo.UpdateResult: 更新结果,包含更新的 _id 列表, 匹配的数量等信息2. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`Name string `bson:"name,omitempty" json:"name,omitempty"`Age int `bson:"age,omitempty" json:"age,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *customUserModel) UpdateAge(ctx context.Context, name string, age int) error {_, err := m.conn.UpdateMany(ctx, bson.M{"name": name}, bson.M{"$set": bson.M{"age": age}})return err}
查询
-
函数签名:FindOne func(ctx context.Context, v, filter interface{}, opts ...*mopt.FindOneOptions) error说明:1. 查询单个文档记录。入参:1. ctx: context2. v: 查询结果2. filter: 过滤条件3. opts: 操作选项返回值:1. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *defaultUserModel) FindOne(ctx context.Context, id string) (*User, error) {oid, err := primitive.ObjectIDFromHex(id)if err != nil {return nil, ErrInvalidObjectId}var data Usererr = m.conn.FindOne(ctx, &data, bson.M{"_id": oid})switch err {case nil:return &data, nilcase mon.ErrNotFound:return nil, ErrNotFounddefault:return nil, err}}
函数签名:Find func(ctx context.Context, v, filter interface{}, opts ...*mopt.FindOptions) error说明:1. 查询单个文档记录。入参:1. ctx: context2. v: 查询结果(数组指针)2. filter: 过滤条件3. opts: 操作选项返回值:1. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *defaultUserModel) Find(ctx context.Context, id string) ([]*User, error) {oid, err := primitive.ObjectIDFromHex(id)if err != nil {return nil, ErrInvalidObjectId}var data []*Usererr = m.conn.Find(ctx, &data, bson.M{"_id": oid})return data, nil}
删除
-
函数签名:DeleteOne func(ctx context.Context, filter interface{}, opts ...*mopt.DeleteOptions) (int64, error)说明:1. 新增单个文档记录。入参:1. ctx: context2. filter: 过滤条件3. opts: 操作选项返回值:1. int64: 删除数量2. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *defaultUserModel) Delete(ctx context.Context, id string) error {oid, err := primitive.ObjectIDFromHex(id)if err != nil {return ErrInvalidObjectId}_, err = m.conn.DeleteOne(ctx, bson.M{"_id": oid})return err}
-
函数签名:DeleteMany func(ctx context.Context, filter interface{}, opts ...*mopt.DeleteOptions) (*mongo.DeleteResult, error)说明:1. 新增单个文档记录。入参:1. ctx: context2. filter: 过滤条件3. opts: 操作选项返回值:1. *mongo.DeleteResult: 删除结果2. error: 执行结果示例:type User struct {ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`// TODO: Fill your own fieldsUpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`}func (m *defaultUserModel) Delete(ctx context.Context, id string) error {oid, err := primitive.ObjectIDFromHex(id)if err != nil {return ErrInvalidObjectId}_, err = m.conn.DeleteMany(ctx, bson.M{"_id": oid})return err}