|
@@ -3,7 +3,6 @@ package mongodbutil
|
|
import (
|
|
import (
|
|
"context"
|
|
"context"
|
|
"log"
|
|
"log"
|
|
- "runtime"
|
|
|
|
"time"
|
|
"time"
|
|
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
@@ -143,17 +142,48 @@ func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
|
|
ms = nil
|
|
ms = nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func (m *MongodbSim) InitPoolDirect() {
|
|
|
|
+ opts := options.Client()
|
|
|
|
+ opts.SetConnectTimeout(3 * time.Second)
|
|
|
|
+ opts.ApplyURI("mongodb://" + m.MongodbAddr)
|
|
|
|
+ opts.SetMaxPoolSize(uint64(m.Size))
|
|
|
|
+ opts.SetDirect(true)
|
|
|
|
+ m.pool = make(chan bool, m.Size)
|
|
|
|
+
|
|
|
|
+ if m.UserName != "" && m.Password != "" {
|
|
|
|
+ cre := options.Credential{
|
|
|
|
+ Username: m.UserName,
|
|
|
|
+ Password: m.Password,
|
|
|
|
+ AuthSource: "admin",
|
|
|
|
+ }
|
|
|
|
+ opts.SetAuth(cre)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ opts.SetMaxConnIdleTime(2 * time.Hour)
|
|
|
|
+ m.Ctx, _ = context.WithTimeout(context.Background(), 99999*time.Hour)
|
|
|
|
+ m.ShortCtx, _ = context.WithTimeout(context.Background(), 1*time.Minute)
|
|
|
|
+ client, err := mongo.Connect(m.ShortCtx, opts)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println("mgo init error:", err.Error())
|
|
|
|
+ } else {
|
|
|
|
+ m.C = client
|
|
|
|
+ log.Println("init success")
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func (m *MongodbSim) InitPool() {
|
|
func (m *MongodbSim) InitPool() {
|
|
opts := options.Client()
|
|
opts := options.Client()
|
|
opts.SetConnectTimeout(3 * time.Second)
|
|
opts.SetConnectTimeout(3 * time.Second)
|
|
opts.ApplyURI("mongodb://" + m.MongodbAddr)
|
|
opts.ApplyURI("mongodb://" + m.MongodbAddr)
|
|
opts.SetMaxPoolSize(uint64(m.Size))
|
|
opts.SetMaxPoolSize(uint64(m.Size))
|
|
|
|
+ //opts.SetDirect(true)
|
|
m.pool = make(chan bool, m.Size)
|
|
m.pool = make(chan bool, m.Size)
|
|
|
|
|
|
if m.UserName != "" && m.Password != "" {
|
|
if m.UserName != "" && m.Password != "" {
|
|
cre := options.Credential{
|
|
cre := options.Credential{
|
|
- Username: m.UserName,
|
|
|
|
- Password: m.Password,
|
|
|
|
|
|
+ Username: m.UserName,
|
|
|
|
+ Password: m.Password,
|
|
|
|
+ AuthSource: "admin",
|
|
}
|
|
}
|
|
opts.SetAuth(cre)
|
|
opts.SetAuth(cre)
|
|
}
|
|
}
|
|
@@ -177,7 +207,29 @@ func (m *MongodbSim) Close() {
|
|
<-m.pool
|
|
<-m.pool
|
|
}
|
|
}
|
|
|
|
|
|
-//批量插入
|
|
|
|
|
|
+// 新建表并生成索引
|
|
|
|
+func (m *MongodbSim) CreateIndex(c string, models []mongo.IndexModel) bool {
|
|
|
|
+ m.Open()
|
|
|
|
+ defer m.Close()
|
|
|
|
+ coll := m.C.Database(m.DbName).Collection(c)
|
|
|
|
+ names, err := coll.Indexes().CreateMany(m.Ctx, models)
|
|
|
|
+ if err == nil && len(names) > 0 {
|
|
|
|
+ return true
|
|
|
|
+ } else {
|
|
|
|
+ log.Println("CreateIndex Error:", err)
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 查询数量
|
|
|
|
+func (m *MongodbSim) Count(coll string, query map[string]interface{}) (int64, error) {
|
|
|
|
+ m.Open()
|
|
|
|
+ defer m.Close()
|
|
|
|
+ c, err := m.C.Database(m.DbName).Collection(coll).CountDocuments(m.Ctx, query)
|
|
|
|
+ return c, err
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 批量插入
|
|
func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
|
|
func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -204,7 +256,7 @@ func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[
|
|
return r.UpsertedIDs, true
|
|
return r.UpsertedIDs, true
|
|
}
|
|
}
|
|
|
|
|
|
-//批量插入
|
|
|
|
|
|
+// 批量插入
|
|
func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
|
|
func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -223,7 +275,7 @@ func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
|
|
|
|
-//保存
|
|
|
|
|
|
+// 保存
|
|
func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
|
|
func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -235,43 +287,41 @@ func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
|
|
return r.InsertedID
|
|
return r.InsertedID
|
|
}
|
|
}
|
|
|
|
|
|
-//按条件更新
|
|
|
|
-func (m *MongodbSim) Update(c string, q, u interface{}, upsert bool, multi bool) bool {
|
|
|
|
- defer catch()
|
|
|
|
|
|
+// 更新by Id
|
|
|
|
+func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
- ct := options.Update()
|
|
|
|
- if upsert {
|
|
|
|
- ct.SetUpsert(true)
|
|
|
|
- }
|
|
|
|
coll := m.C.Database(m.DbName).Collection(c)
|
|
coll := m.C.Database(m.DbName).Collection(c)
|
|
- var err error
|
|
|
|
- if multi {
|
|
|
|
- _, err = coll.UpdateMany(m.Ctx, ObjToM(q), ObjToM(u), ct)
|
|
|
|
- } else {
|
|
|
|
- _, err = coll.UpdateOne(m.Ctx, ObjToM(q), ObjToM(u), ct)
|
|
|
|
|
|
+ _, err := coll.UpdateOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)}, doc)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return false
|
|
}
|
|
}
|
|
|
|
+ return true
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (m *MongodbSim) UpdateStrId(c, id string, doc map[string]interface{}) bool {
|
|
|
|
+ m.Open()
|
|
|
|
+ defer m.Close()
|
|
|
|
+ coll := m.C.Database(m.DbName).Collection(c)
|
|
|
|
+ _, err := coll.UpdateOne(m.Ctx, map[string]interface{}{"_id": id}, doc)
|
|
if err != nil {
|
|
if err != nil {
|
|
- log.Println("删除错误", err.Error())
|
|
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
|
|
|
|
-//更新by Id
|
|
|
|
-func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
|
|
|
|
|
|
+func (m *MongodbSim) UpdateQueryData(c string, query map[string]interface{}, doc map[string]interface{}) bool {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
coll := m.C.Database(m.DbName).Collection(c)
|
|
coll := m.C.Database(m.DbName).Collection(c)
|
|
- _, err := coll.UpdateOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)}, doc)
|
|
|
|
|
|
+ _, err := coll.UpdateOne(m.Ctx, query, doc)
|
|
if err != nil {
|
|
if err != nil {
|
|
- log.Println(err)
|
|
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
|
|
|
|
-//删除by id
|
|
|
|
|
|
+// 删除by id
|
|
func (m *MongodbSim) DeleteById(c, id string) int64 {
|
|
func (m *MongodbSim) DeleteById(c, id string) int64 {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -283,7 +333,7 @@ func (m *MongodbSim) DeleteById(c, id string) int64 {
|
|
return r.DeletedCount
|
|
return r.DeletedCount
|
|
}
|
|
}
|
|
|
|
|
|
-//通过条件删除
|
|
|
|
|
|
+// 通过条件删除
|
|
func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
|
|
func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -295,7 +345,7 @@ func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
|
|
return r.DeletedCount
|
|
return r.DeletedCount
|
|
}
|
|
}
|
|
|
|
|
|
-//findbyid
|
|
|
|
|
|
+// findbyid
|
|
func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
|
|
func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -306,7 +356,7 @@ func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
|
|
return v
|
|
return v
|
|
}
|
|
}
|
|
|
|
|
|
-//findone
|
|
|
|
|
|
+// findone
|
|
func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
|
|
func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -317,7 +367,7 @@ func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]
|
|
return v
|
|
return v
|
|
}
|
|
}
|
|
|
|
|
|
-//find
|
|
|
|
|
|
+// find
|
|
func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
|
|
func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
|
|
m.Open()
|
|
m.Open()
|
|
defer m.Close()
|
|
defer m.Close()
|
|
@@ -328,6 +378,27 @@ func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields i
|
|
log.Fatal(err)
|
|
log.Fatal(err)
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ var results []map[string]interface{}
|
|
|
|
+ if err = r.All(m.Ctx, &results); err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ return results, nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// find
|
|
|
|
+func (m *MongodbSim) FindLimit(c string, query map[string]interface{}, sort, fields interface{}, limit int64) ([]map[string]interface{}, error) {
|
|
|
|
+ m.Open()
|
|
|
|
+ defer m.Close()
|
|
|
|
+ coll := m.C.Database(m.DbName).Collection(c)
|
|
|
|
+ op := options.Find()
|
|
|
|
+ r, err := coll.Find(m.Ctx, query, op.SetSort(sort), op.SetProjection(fields), op.SetLimit(limit))
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+
|
|
var results []map[string]interface{}
|
|
var results []map[string]interface{}
|
|
if err = r.All(m.Ctx, &results); err != nil {
|
|
if err = r.All(m.Ctx, &results); err != nil {
|
|
log.Fatal(err)
|
|
log.Fatal(err)
|
|
@@ -344,17 +415,3 @@ func StringTOBsonId(id string) primitive.ObjectID {
|
|
func BsonTOStringId(id interface{}) string {
|
|
func BsonTOStringId(id interface{}) string {
|
|
return id.(primitive.ObjectID).Hex()
|
|
return id.(primitive.ObjectID).Hex()
|
|
}
|
|
}
|
|
-
|
|
|
|
-//出错拦截
|
|
|
|
-func catch() {
|
|
|
|
- if r := recover(); r != nil {
|
|
|
|
- log.Println(r)
|
|
|
|
- for skip := 0; ; skip++ {
|
|
|
|
- _, file, line, ok := runtime.Caller(skip)
|
|
|
|
- if !ok {
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- go log.Printf("%v,%v\n", file, line)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|