ver_helper.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package db
  2. import (
  3. "context"
  4. dbFacade "f1-game/internal/component/db/facade"
  5. clog "github.com/cherry-game/cherry/logger"
  6. "go.mongodb.org/mongo-driver/v2/bson"
  7. "go.mongodb.org/mongo-driver/v2/mongo"
  8. "go.mongodb.org/mongo-driver/v2/mongo/options"
  9. )
  10. // TODO 暂时放这里
  11. func getAllTables[T dbFacade.Table](tableName string) []T {
  12. ctx := context.Background()
  13. collection := dbComponent.DB().Collection(tableName)
  14. filter := bson.M{}
  15. cur, err := collection.Find(ctx, filter)
  16. if err != nil {
  17. clog.Errorf("getAllTables: err = %v", err)
  18. return nil
  19. }
  20. list := []T{}
  21. err = cur.All(ctx, &list)
  22. if err != nil {
  23. clog.Errorf("getAllTables: err = %v", err)
  24. return nil
  25. }
  26. return list
  27. }
  28. func getAllTableMap[T dbFacade.Table](tableName string) map[any]T {
  29. list := getAllTables[T](tableName)
  30. m := map[any]T{}
  31. for _, table := range list {
  32. m[table.PrimaryValue()] = table
  33. }
  34. return m
  35. }
  36. func bulkWrite[T dbFacade.Table](collection *mongo.Collection, list []T) error {
  37. // // 构建批量更新对象
  38. models := make([]mongo.WriteModel, 0, len(list))
  39. for _, table := range list {
  40. tableBytes, err := bson.Marshal(table)
  41. if err != nil {
  42. return err
  43. }
  44. // set update
  45. update := bson.D{{Key: "$set", Value: bson.Raw(tableBytes)}}
  46. // set filter
  47. filter := bson.M{
  48. "_id": table.PrimaryValue(), // 利用自带的_id主键进行条件过滤
  49. }
  50. // build *mongo.UpdateOneModel
  51. model := mongo.NewUpdateOneModel().SetFilter(filter).SetUpdate(update).SetUpsert(true)
  52. models = append(models, model)
  53. }
  54. ops := options.BulkWrite().SetOrdered(false)
  55. result, err := collection.BulkWrite(context.TODO(), models, ops)
  56. if err != nil {
  57. return err
  58. }
  59. clog.Debugf("bulk write [table = %s, count = %d]", collection.Name(), result.ModifiedCount)
  60. return nil
  61. }