game_sync/dao/red_packet.go

89 lines
2.5 KiB
Go

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
}