Bläddra i källkod

修改mongo工具类

renzheng 9 år sedan
förälder
incheckning
2a20babb25
2 ändrade filer med 100 tillägg och 62 borttagningar
  1. 13 0
      common/src/qfw/util/common.go
  2. 87 62
      common/src/qfw/util/mongodb/mongodbSim.go

+ 13 - 0
common/src/qfw/util/common.go

@@ -407,3 +407,16 @@ func EndWith(value, str string) bool {
 	ok, _ := regexp.MatchString(str+"$", value)
 	return ok
 }
+
+//出错拦截
+func Catch() {
+	if r := recover(); r != nil {
+		for skip := 0; ; skip++ {
+			_, file, line, ok := runtime.Caller(skip)
+			if !ok {
+				break
+			}
+			go log.Printf("%v,%v\n", file, line)
+		}
+	}
+}

+ 87 - 62
common/src/qfw/util/mongodb/mongodbSim.go

@@ -1,10 +1,13 @@
 package mongodb
 
 import (
+	"fmt"
+	"strings"
 	mgo "gopkg.in/mgo.v2"
 	"log"
-	"runtime"
 	"time"
+	"qfw/util"
+	. "gopkg.in/mgo.v2/bson"
 )
 
 type MongodbSim struct {
@@ -15,18 +18,7 @@ type MongodbSim struct {
 }
 
 func (m *MongodbSim) InitPool() {
-	defer func() {
-		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)
-			}
-		}
-	}()
+	defer util.Catch()
 	m.pool = make(chan *mgo.Session, m.Size)
 	for i := 0; i < m.Size; i++ {
 		sess, err := m.createConn()
@@ -37,18 +29,7 @@ func (m *MongodbSim) InitPool() {
 }
 
 func (m *MongodbSim) GetMgoConn() (session *mgo.Session) {
-	defer func() {
-		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)
-			}
-		}
-	}()
+	defer util.Catch()
 	select {
 	case session = <-m.pool:
 		err := session.Ping()
@@ -79,22 +60,11 @@ func (m *MongodbSim) createConn() (sess *mgo.Session, err error) {
 
 //统计
 func (m *MongodbSim) Count(c string, query interface{}) int {
+	defer util.Catch()
 	sess := m.GetMgoConn()
 	//log.Println("count:", m.Size, m.MongodbAddr, m.DbName, sess, m.GetMgoConn(), m)
 	var n int = 0
 	if sess != nil {
-		defer func() {
-			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)
-				}
-			}
-		}()
 		defer m.DestoryMongoConn(sess)
 		coll := sess.DB(m.DbName).C(c)
 		var err error
@@ -107,21 +77,10 @@ func (m *MongodbSim) Count(c string, query interface{}) int {
 }
 
 func (m *MongodbSim) Update(c string, query interface{}, set interface{}, upsert bool, multi bool) bool {
+	defer util.Catch()
 	sess := m.GetMgoConn()
 	b := true
 	if sess != nil {
-		defer func() {
-			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)
-				}
-			}
-		}()
 		defer m.DestoryMongoConn(sess)
 		coll := sess.DB(m.DbName).C(c)
 		var err error
@@ -144,22 +103,10 @@ func (m *MongodbSim) Update(c string, query interface{}, set interface{}, upsert
 
 //批量插入
 func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
+	defer util.Catch()
 	sess := m.GetMgoConn()
 	b := true
 	if sess != nil {
-		defer func() {
-			b = false
-			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)
-				}
-			}
-		}()
 		defer m.DestoryMongoConn(sess)
 		coll := sess.DB(m.DbName).C(c)
 		bulk := coll.Bulk()
@@ -176,3 +123,81 @@ func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
 	}
 	return b
 }
+
+
+func (m *MongodbSim) Save(c string, doc interface{}) string {
+	defer util.Catch()
+	sess := m.GetMgoConn()
+	if sess != nil {
+		defer m.DestoryMongoConn(sess)
+		coll := sess.DB(DB).C(c)
+		obj := ObjToM(doc)
+		id := NewObjectId()
+		(*obj)["_id"] = id
+		err := coll.Insert(obj)
+		if nil != err {
+			log.Println("SaveError", err)
+			return ""
+		}
+		return (strings.Split(fmt.Sprintf("%s", id), `"`)[1])
+	}
+	return ""
+}
+
+
+//查询单条对象
+func (m *MongodbSim) FindOne(c string, query interface{}) *map[string]interface{} {
+	return m.FindOneByField(c, query, nil)
+}
+
+//查询单条对象
+func (m *MongodbSim) FindOneByField(c string, query interface{}, fields interface{}) *map[string]interface{} {
+	defer util.Catch()
+	res := m.Find(c, query, nil, fields, true, -1, -1)
+	if nil != res && len(*res) > 0 {
+		return &((*res)[0])
+	}
+	return nil
+}
+
+//查询单条对象
+func (m *MongodbSim) FindById(c string, query string, fields interface{}) *map[string]interface{} {
+	defer util.Catch()
+	sess := m.GetMgoConn()
+	var res map[string]interface{}
+	if sess != nil {
+		defer m.DestoryMongoConn(sess)
+		res = make(map[string]interface{})
+		coll := sess.DB(DB).C(c)
+		var err error
+		err = coll.FindId(ObjectIdHex(query)).Select(ObjToOth(fields)).One(&res)
+		if nil != err {
+			log.Println("FindByIdError", err)
+		}
+	}
+	return &res
+}
+
+//底层查询方法
+func (m *MongodbSim) Find(c string, query interface{}, order interface{}, fields interface{}, single bool, start int, limit int) *[]map[string]interface{} {
+	defer util.Catch()
+	sess := m.GetMgoConn()
+	var res []map[string]interface{}
+	if sess != nil {
+		defer m.DestoryMongoConn(sess)
+		res = make([]map[string]interface{}, 1)
+		coll := sess.DB(DB).C(c)
+		var err error
+		if single {
+			err = coll.Find(ObjToM(query)).Select(ObjToOth(fields)).One(&res[0])
+		} else if start > -1 {
+			err = coll.Find(ObjToM(query)).Select(ObjToOth(fields)).Sort(ObjToArr(order)...).Skip(start).Limit(limit).All(&res)
+		} else {
+			err = coll.Find(ObjToM(query)).Select(ObjToOth(fields)).Sort(ObjToArr(order)...).All(&res)
+		}
+		if nil != err {
+			log.Println("FindError", err)
+		}
+	}
+	return &res
+}