| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package db
- import (
- "context"
- dbFacade "f1-game/internal/component/db/facade"
- clog "github.com/cherry-game/cherry/logger"
- "go.mongodb.org/mongo-driver/v2/bson"
- "go.mongodb.org/mongo-driver/v2/mongo"
- "go.mongodb.org/mongo-driver/v2/mongo/options"
- )
- // TODO 暂时放这里
- func getAllTables[T dbFacade.Table](tableName string) []T {
- ctx := context.Background()
- collection := dbComponent.DB().Collection(tableName)
- filter := bson.M{}
- cur, err := collection.Find(ctx, filter)
- if err != nil {
- clog.Errorf("getAllTables: err = %v", err)
- return nil
- }
- list := []T{}
- err = cur.All(ctx, &list)
- if err != nil {
- clog.Errorf("getAllTables: err = %v", err)
- return nil
- }
- return list
- }
- func getAllTableMap[T dbFacade.Table](tableName string) map[any]T {
- list := getAllTables[T](tableName)
- m := map[any]T{}
- for _, table := range list {
- m[table.PrimaryValue()] = table
- }
- return m
- }
- func bulkWrite[T dbFacade.Table](collection *mongo.Collection, list []T) error {
- // // 构建批量更新对象
- models := make([]mongo.WriteModel, 0, len(list))
- for _, table := range list {
- tableBytes, err := bson.Marshal(table)
- if err != nil {
- return err
- }
- // set update
- update := bson.D{{Key: "$set", Value: bson.Raw(tableBytes)}}
- // set filter
- filter := bson.M{
- "_id": table.PrimaryValue(), // 利用自带的_id主键进行条件过滤
- }
- // build *mongo.UpdateOneModel
- model := mongo.NewUpdateOneModel().SetFilter(filter).SetUpdate(update).SetUpsert(true)
- models = append(models, model)
- }
- ops := options.BulkWrite().SetOrdered(false)
- result, err := collection.BulkWrite(context.TODO(), models, ops)
- if err != nil {
- return err
- }
- clog.Debugf("bulk write [table = %s, count = %d]", collection.Name(), result.ModifiedCount)
- return nil
- }
|