4 Commits
v2.0.12 ... v2

Author SHA1 Message Date
3a826ac216 fixed sort via pipeline 2022-12-07 15:16:09 +01:00
ede07bb49a extended interface 2022-02-21 15:26:23 +01:00
6834a79601 ValidateObject not in interface 2022-02-14 16:01:12 +01:00
336dea8147 ensure multiple index via db interface 2022-02-10 16:10:38 +01:00
5 changed files with 43 additions and 12 deletions

View File

@@ -176,13 +176,15 @@ func (db *MgoDatabase) ReadCollection(results interface{}, filter bson.M, select
}
if len(sort) > 0 {
sortM := bson.M{}
sortM := bson.D{}
for _, s := range sort {
if strings.HasPrefix(s, "-") {
s = s[1:]
sortM[s] = -1
sortM = append(sortM, bson.DocElem{Name: s, Value: -1})
// sortM[s] = -1
} else {
sortM[s] = 1
sortM = append(sortM, bson.DocElem{Name: s, Value: 1})
// sortM[s] = 1
}
}
// spew.Dump(sortM)

24
mgo.go
View File

@@ -36,8 +36,13 @@ func (c *MgoConnection) Close() {
}
type MgoSession struct {
session *mgo.Session
closed bool
connection *MgoConnection
session *mgo.Session
closed bool
}
func (s *MgoSession) Connection() Connection {
return s.connection
}
func (s *MgoSession) Close() {
@@ -49,7 +54,10 @@ func (s *MgoSession) Close() {
}
func (c *MgoConnection) NewSession() Session {
s := &MgoSession{session: c.connection.Copy()}
s := &MgoSession{
connection: c,
session: c.connection.Copy(),
}
runtime.SetFinalizer(s, func(s *MgoSession) {
if !s.closed {
s.Close()
@@ -68,15 +76,23 @@ func (s *MgoSession) DB(name string) Database {
}
type MgoCollection struct {
database *MgoDatabase
collection *mgo.Collection
}
func (c *MgoCollection) DB() Database {
return c.database
}
func (db *MgoDatabase) Session() Session {
return db.session
}
func (db *MgoDatabase) C(name string) Collection {
return &MgoCollection{collection: db.database.C(name)}
return &MgoCollection{
database: db,
collection: db.database.C(name),
}
}
func (db *MgoDatabase) Name() string {

View File

@@ -9,10 +9,22 @@ import (
)
// EnsureIndex ensured mongodb index reflecting model struct index tag
func (db *MgoDatabase) EnsureIndex(m ModelInterface) error {
func (db *MgoDatabase) EnsureIndex(m ModelInterface, index ...Index) error {
colName := GetCollectionName(m)
col := db.C(colName)
if len(index) > 0 {
// only ensure given index
for _, i := range index {
err := col.EnsureIndex(i)
if err != nil {
return err
}
}
return nil
}
// ensure index by struct fields
mType := reflect.TypeOf(m)
textFields := []string{}

View File

@@ -16,16 +16,16 @@ type Connection interface {
}
type Session interface {
Connection() Connection
Close()
DB(name string) Database
}
type Database interface {
Session() Session
C(name string) Collection
// C(name string) Collection
Name() string
EnsureIndex(m ModelInterface) error
ValidateObject(m ModelInterface, changes bson.M) error
EnsureIndex(m ModelInterface, index ...Index) error
ReadDocument(m ModelInterface, selector bson.M) error
CreateDocument(m ModelInterface) error
ReadCollection(results interface{}, filter bson.M, selector bson.M, offset int, limit int, sort []string, pipelineModifier PipelineModifierFunction) error
@@ -37,6 +37,7 @@ type Database interface {
}
type Collection interface {
DB() Database
Insert(docs ...interface{}) error
UpdateId(id interface{}, update interface{}) error
RemoveId(id interface{}) error

View File

@@ -6,7 +6,7 @@ import (
)
// ValidateObject validates object via validator tag and custom method
func (db *MgoDatabase) ValidateObject(m ModelInterface, changes bson.M) error {
func ValidateObject(db Database, m ModelInterface, changes bson.M) error {
// first validate via struct tag
validator := validator.New(&validator.Config{
TagName: "validator",