package dao import ( "context" "errors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/mongox" "mongo.games.com/game/dao/internal" modelpkg "mongo.games.com/game/model" ) var ( _ = context.Background() _ = logger.Logger _ = bson.M{} _ = mongo.Database{} ) type RedPacketColumns = internal.RedPacketColumns type RedPacket struct { *internal.RedPacket } func GetRedPacket(key string) (*RedPacket, error) { return mongox.GetDao(key, NewRedPacket) } func NewRedPacket(db *mongo.Database, c *mongo.Collection) (*RedPacket, any) { if db == nil || c == nil { return &RedPacket{}, &modelpkg.RedPacket{} } v := internal.NewRedPacket() v.Database = db v.Collection = c // 创建索引 c.Indexes().CreateOne(context.Background(), mongo.IndexModel{ Keys: bson.D{{"cid", 1}}, // 1 表示升序,-1 表示降序 Options: options.Index().SetBackground(true).SetSparse(true), // 后台创建索引,稀疏索引 }) c.Indexes().CreateOne(context.Background(), mongo.IndexModel{ Keys: bson.D{{"ts", 1}}, // 1 表示升序,-1 表示降序 Options: options.Index().SetBackground(true).SetSparse(true), // 后台创建索引,稀疏索引 }) c.Indexes().CreateOne(context.Background(), mongo.IndexModel{ Keys: bson.D{{"ts", -1}}, // 1 表示升序,-1 表示降序 Options: options.Index().SetBackground(true).SetSparse(true), // 后台创建索引,稀疏索引 }) return &RedPacket{RedPacket: v}, &modelpkg.RedPacket{} } func (r *RedPacket) GetAll() (res []*modelpkg.RedPacket, err error) { res, err = r.FindMany(context.Background(), func(cols *RedPacketColumns) interface{} { return bson.M{} }) if err != nil && !errors.Is(err, mongo.ErrNoDocuments) { return nil, err } return res, nil } func (r *RedPacket) UpdateAll(list []*modelpkg.RedPacket) error { var operations []mongo.WriteModel for _, v := range list { updateDataMap := bson.M{ "$set": v, } delete(updateDataMap["$set"].(bson.M), "_id") // 删除 _id 字段 operations = append(operations, mongo.NewUpdateOneModel().SetFilter(bson.M{"_id": v.ID}).SetUpdate(bson.M{"$set": v}).SetUpsert(true)) } _, err := r.Collection.BulkWrite(context.Background(), operations) // 批量更新 if err != nil { logger.Logger.Errorf("RedPacket.UpdateAll error: %v", err) return err } return nil }