47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
package model
|
|
|
|
import (
|
|
"context"
|
|
"github.com/zeromicro/go-zero/core/stores/cache"
|
|
"github.com/zeromicro/go-zero/core/stores/monc"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
var _ AutoIdModel = (*customAutoIdModel)(nil)
|
|
|
|
type (
|
|
// AutoIdModel is an interface to be customized, add more methods here,
|
|
// and implement the added methods in customAutoIdModel.
|
|
AutoIdModel interface {
|
|
autoIdModel
|
|
Inc(ctx context.Context, data *AutoId) error
|
|
}
|
|
|
|
customAutoIdModel struct {
|
|
*defaultAutoIdModel
|
|
}
|
|
)
|
|
|
|
// NewAutoIdModel returns a model for the mongo.
|
|
func NewAutoIdModel(url, db, collection string, c cache.CacheConf) AutoIdModel {
|
|
conn := monc.MustNewModel(url, db, collection, c)
|
|
return &customAutoIdModel{
|
|
defaultAutoIdModel: newDefaultAutoIdModel(conn),
|
|
}
|
|
}
|
|
|
|
func (m *customAutoIdModel) Inc(ctx context.Context, data *AutoId) error {
|
|
filter := bson.M{"admin": "auto_id"}
|
|
update := bson.M{"$inc": bson.M{"counter": 1}}
|
|
|
|
key := prefixAutoIdCacheKey + "count"
|
|
|
|
err := m.conn.FindOneAndUpdate(ctx, key, data, filter, update,
|
|
options.FindOneAndUpdate().SetUpsert(true),
|
|
options.FindOneAndUpdate().SetReturnDocument(options.After),
|
|
)
|
|
|
|
return err
|
|
}
|