|
@@ -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
|
|
|
+}
|