Blame view

common/db/mongoproxy/mongoplugin.go 4.58 KB
436e0af4   zhangqijia   reactor: dir; Ac...
1
  package mongoproxy
765431a4   zhangqijia   增加schema接口, 抽象 mo...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  
  import (
  	"context"
  	"fmt"
  	"go.mongodb.org/mongo-driver/bson"
  	"go.mongodb.org/mongo-driver/mongo"
  	"go.mongodb.org/mongo-driver/mongo/options"
  	"go.mongodb.org/mongo-driver/mongo/readpref"
  	"go.mongodb.org/mongo-driver/x/bsonx"
  	"pro2d/common"
  	"pro2d/common/logger"
  	"reflect"
  	"sort"
  	"strings"
  	"time"
  )
  
  func DB() *mongo.Database {
  	return mongoDatabase
  }
  
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
23
  func ConnectMongo(conf *common.MongoConf, ID int64) error {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
24
  	var uri string
101d1cc1   zhangqijia   feat: 一个基于redis的自...
25
  	if conf.User != "" {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
26
27
  		//uri = fmt.Sprintf("mongodb://%s:%s@%s:%d/%s?w=majority", conf.User, conf.Password, conf.Host, conf.Port, conf.DBName)
  		uri = fmt.Sprintf("mongodb://%s:%s@%s:%d/?w=majority", conf.User, conf.Password, conf.Host, conf.Port)
101d1cc1   zhangqijia   feat: 一个基于redis的自...
28
  	} else {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
29
30
31
32
  		//uri = fmt.Sprintf("mongodb://%s:%d/%s?w=majority", conf.Host, conf.Port, conf.DBName)
  		uri = fmt.Sprintf("mongodb://%s:%d/?w=majority", conf.Host, conf.Port)
  	}
  	// 设置连接超时时间
101d1cc1   zhangqijia   feat: 一个基于redis的自...
33
  	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(conf.TimeOut)*time.Second)
765431a4   zhangqijia   增加schema接口, 抽象 mo...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  	defer cancel()
  	// 通过传进来的uri连接相关的配置
  	o := options.Client().ApplyURI(uri)
  	// 设置最大连接数 - 默认是100 ,不设置就是最大 max 64
  	o.SetMaxPoolSize(uint64(conf.MaxNum))
  	// 发起链接
  	var err error
  	mongoClient, err = mongo.Connect(ctx, o)
  	if err != nil {
  		return err
  	}
  	// 判断服务是不是可用
  	if err = mongoClient.Ping(context.Background(), readpref.Primary()); err != nil {
  		return err
  	}
  
97bec184   zhangqijia   fix: 账号系统只有一个数据库。
50
51
52
53
54
  	if conf.DBName != "account" {
  		mongoDatabase = mongoClient.Database(fmt.Sprintf("%s_%d", conf.DBName, ID))
  	} else {
  		mongoDatabase = mongoClient.Database(conf.DBName)
  	}
765431a4   zhangqijia   增加schema接口, 抽象 mo...
55
56
57
  	return nil
  }
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
58
  func CloseMongo() {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  	mongoClient.Disconnect(context.TODO())
  }
  
  func CreateTable(tb string) error {
  	colls, _ := DB().ListCollectionNames(context.TODO(), bson.D{})
  	pos := sort.SearchStrings(colls, tb)
  	if pos != len(colls) {
  		if tb == colls[pos] {
  			return DB().CreateCollection(context.TODO(), tb)
  		}
  	}
  	return DB().CreateCollection(context.TODO(), tb)
  }
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
73
74
  func FindOne(coll string, pri interface{}, schema interface{}) error {
  	r := mongoDatabase.Collection(coll).FindOne(context.TODO(), pri)
765431a4   zhangqijia   增加schema接口, 抽象 mo...
75
76
77
  	return r.Decode(schema)
  }
  
8d983031   zhangqijia   loginReq uid -> t...
78
  func FindMany(coll string, key string, val interface{}, schema interface{}) error {
101d1cc1   zhangqijia   feat: 一个基于redis的自...
79
  	r, err := mongoDatabase.Collection(coll).Find(context.TODO(), bson.M{key: val})
8d983031   zhangqijia   loginReq uid -> t...
80
81
82
83
  	if err != nil {
  		return err
  	}
  	return r.All(context.TODO(), schema)
e172952c   zhangqijia   feat: email 系统搭建
84
85
86
87
88
89
90
91
  }
  
  func FindManyFilter(coll string, filter bson.D, opts *options.FindOptions, schema interface{}) error {
  	r, err := mongoDatabase.Collection(coll).Find(context.TODO(), filter, opts)
  	if err != nil {
  		return err
  	}
  	return r.All(context.TODO(), schema)
8d983031   zhangqijia   loginReq uid -> t...
92
93
  }
  
c2791869   zhangqijia   fix: gm增加删除装备删除物品接口
94
95
96
97
98
99
  func DelOne(coll string, key string, value interface{}) error {
  	filter := bson.D{{key, value}}
  	_, err := mongoDatabase.Collection(coll).DeleteOne(context.TODO(), filter, nil)
  	return err
  }
  
f74e34e3   zhangqijia   fix: 批量删除装备
100
  func DelMany(coll string, filter bson.D) error {
8db23cb6   zhangqijia   fix: 批量删除装备 mongo...
101
102
  	r, err := mongoDatabase.Collection(coll).DeleteMany(context.TODO(), filter, nil)
  	logger.Debug(r.DeletedCount)
f74e34e3   zhangqijia   fix: 批量删除装备
103
104
105
  	return err
  }
  
765431a4   zhangqijia   增加schema接口, 抽象 mo...
106
  func GetBsonD(key string, value interface{}) interface{} {
101d1cc1   zhangqijia   feat: 一个基于redis的自...
107
  	return bson.D{{key, value}}
765431a4   zhangqijia   增加schema接口, 抽象 mo...
108
109
  }
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
110
  func GetBsonM(key string, value interface{}) interface{} {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
111
112
113
  	return bson.M{key: value}
  }
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
114
  func GetSchemaType(schema interface{}) reflect.Type {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
  	s := reflect.TypeOf(schema)
  	if s.Kind() == reflect.Ptr {
  		s = reflect.TypeOf(schema).Elem()
  	}
  	return s
  }
  
  func GetCollName(schema interface{}) string {
  	return strings.ToLower(GetSchemaType(schema).Name())
  }
  
  func GetPriKey(schema interface{}) string {
  	s := GetSchemaType(schema)
  
  	var pri string
  	for i := 0; i < s.NumField(); i++ {
  		if s.Field(i).Tag.Get("pri") == "1" {
  			pri = strings.ToLower(s.Field(i).Name)
  			break
  		}
  	}
  	return pri
  }
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
139
  func FindIndex(schema interface{}) (string, []string) {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
  	s := GetSchemaType(schema)
  
  	var index []string
  	for i := 0; i < s.NumField(); i++ {
  		if s.Field(i).Tag.Get("index") != "" {
  			js := strings.Split(s.Field(i).Tag.Get("json"), ",")
  			if len(js) == 0 {
  				continue
  			}
  			index = append(index, js[0])
  		}
  	}
  	return strings.ToLower(s.Name()), index
  }
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
155
  func SetUnique(coll, key string) (string, error) {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
156
157
158
  	return DB().Collection(coll).Indexes().CreateOne(
  		context.TODO(),
  		mongo.IndexModel{
101d1cc1   zhangqijia   feat: 一个基于redis的自...
159
  			Keys:    bsonx.Doc{{key, bsonx.Int32(1)}},
765431a4   zhangqijia   增加schema接口, 抽象 mo...
160
161
162
163
164
  			Options: options.Index().SetUnique(true),
  		},
  	)
  }
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
165
  func InitDoc(schema ...interface{}) {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
166
167
168
  	for _, s := range schema {
  		coll, keys := FindIndex(s)
  		CreateTable(coll)
101d1cc1   zhangqijia   feat: 一个基于redis的自...
169
  		for _, index := range keys {
765431a4   zhangqijia   增加schema接口, 抽象 mo...
170
171
172
173
174
175
176
177
178
179
  
  			logger.Debug("InitDoc collect: %v, createIndex: %s", coll, index)
  			res, err := SetUnique(coll, index)
  			if err != nil {
  				logger.Error("InitDoc unique: %s, err: %v", res, err)
  				continue
  			}
  		}
  	}
  
101d1cc1   zhangqijia   feat: 一个基于redis的自...
180
  }