|
@@ -0,0 +1,99 @@
|
|
|
+package mongo_util
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "go.mongodb.org/mongo-driver/bson"
|
|
|
+ "go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
+ "log"
|
|
|
+ "runtime"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+//异常处理,主要是输出日志
|
|
|
+func panicHandler() {
|
|
|
+ if r := recover(); r != nil {
|
|
|
+ log.Println("[E]", r)
|
|
|
+ for skip := 1; ; skip++ {
|
|
|
+ _, file, line, ok := runtime.Caller(skip)
|
|
|
+ if !ok {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ go log.Printf("%v,%v\n", file, line)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func ObjToOth(query interface{}) *bson.M {
|
|
|
+ return ObjToMQ(query, false)
|
|
|
+}
|
|
|
+func ObjToM(query interface{}) *bson.M {
|
|
|
+ return ObjToMQ(query, true)
|
|
|
+}
|
|
|
+func ObjToMQ(query interface{}, isQuery bool) *bson.M {
|
|
|
+ defer panicHandler()
|
|
|
+ data := make(bson.M)
|
|
|
+ if s2, ok2 := query.(*map[string]interface{}); ok2 {
|
|
|
+ data = bson.M(*s2)
|
|
|
+ } else if s3, ok3 := query.(*bson.M); ok3 {
|
|
|
+ return s3
|
|
|
+ } else if s, ok := query.(string); ok {
|
|
|
+ json.Unmarshal([]byte(strings.Replace(s, "'", "\"", -1)), &data)
|
|
|
+ if ss, oks := data["_id"]; oks && isQuery {
|
|
|
+ switch ss.(type) {
|
|
|
+ case string:
|
|
|
+ data["_id"], _ = primitive.ObjectIDFromHex(ss.(string))
|
|
|
+ case map[string]interface{}:
|
|
|
+ tmp := ss.(map[string]interface{})
|
|
|
+ for k, v := range tmp {
|
|
|
+ tmp[k], _ = primitive.ObjectIDFromHex(v.(string))
|
|
|
+ }
|
|
|
+ data["_id"] = tmp
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ } else if s1, ok1 := query.(map[string]interface{}); ok1 {
|
|
|
+ data = s1
|
|
|
+ } else if s4, ok4 := query.(bson.M); ok4 {
|
|
|
+ data = s4
|
|
|
+ } else {
|
|
|
+ data = nil
|
|
|
+ }
|
|
|
+ return &data
|
|
|
+}
|
|
|
+
|
|
|
+//数据更新
|
|
|
+func (mu *MongoUtil) Update(db string, c string, query interface{}, set interface{}, multi bool) error {
|
|
|
+ coll := mu.client.Database(db).Collection(c)
|
|
|
+ var err error
|
|
|
+ if multi {
|
|
|
+ _, err = coll.UpdateMany(mu.getContext(10), ObjToM(query), ObjToM(set))
|
|
|
+ } else {
|
|
|
+ _, err = coll.UpdateOne(mu.getContext(10), ObjToM(query), ObjToM(set))
|
|
|
+ }
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+//批量修改
|
|
|
+func (mu *MongoUtil) UpdateBulk(db string, c string, query interface{}, doc ...[]map[string]interface{}) error {
|
|
|
+ //TODO 暂未实现
|
|
|
+ //coll := mu.client.Database(db).Collection(c)
|
|
|
+ //var err error
|
|
|
+ //var operations []mongo.WriteModel
|
|
|
+ //
|
|
|
+ //operation := mongo.NewUpdateOneModel()
|
|
|
+ //operation.Filter=ObjToM(query)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+//按ID删除
|
|
|
+func (mu *MongoUtil) DelById(db, c, id string) {
|
|
|
+ defer panicHandler()
|
|
|
+ coll := mu.client.Database(db).Collection(c)
|
|
|
+ _, mongonId := primitive.ObjectIDFromHex(id)
|
|
|
+ coll.FindOneAndDelete(mu.getContext(10), bson.M{"_id": mongonId})
|
|
|
+}
|
|
|
+
|
|
|
+//删除对象
|
|
|
+func Del(db, c string, query interface{}) {
|
|
|
+
|
|
|
+}
|