convert _id in filter to ObjectID
This commit is contained in:
parent
62b7717da7
commit
1fee9fe349
82
crud.go
82
crud.go
@ -37,6 +37,84 @@ func ReadDocument(db *mgo.Database, m ModelInterface, selector bson.M) error {
|
|||||||
// PipelineModifierFunction is a function to modify mongodb query
|
// PipelineModifierFunction is a function to modify mongodb query
|
||||||
type PipelineModifierFunction func(pipeline []bson.M) []bson.M
|
type PipelineModifierFunction func(pipeline []bson.M) []bson.M
|
||||||
|
|
||||||
|
func convertIDValue(v reflect.Value) reflect.Value {
|
||||||
|
v = reflect.ValueOf(v.Interface())
|
||||||
|
vKind := v.Kind() // mapVal.Kind() does not work, no idea why ;(
|
||||||
|
spew.Dump(v.Interface())
|
||||||
|
spew.Dump(vKind)
|
||||||
|
|
||||||
|
switch vKind {
|
||||||
|
case reflect.String:
|
||||||
|
return reflect.ValueOf(bson.ObjectIdHex(v.Interface().(string)))
|
||||||
|
case reflect.Map:
|
||||||
|
for _, key := range v.MapKeys() {
|
||||||
|
v.SetMapIndex(key, convertIDValue(v.MapIndex(key)))
|
||||||
|
}
|
||||||
|
case reflect.Slice:
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
v.Index(i).Set(convertIDValue(v.Index(i)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func idToObjectID(filter interface{}) {
|
||||||
|
spew.Dump(filter)
|
||||||
|
val := reflect.ValueOf(filter)
|
||||||
|
switch reflect.TypeOf(filter).Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
for i := 0; i < val.Len(); i++ {
|
||||||
|
idToObjectID(val.Index(i).Interface())
|
||||||
|
}
|
||||||
|
case reflect.Ptr:
|
||||||
|
idToObjectID(reflect.Indirect(val).Interface())
|
||||||
|
case reflect.Map:
|
||||||
|
for _, key := range val.MapKeys() {
|
||||||
|
if k, ok := key.Interface().(string); ok {
|
||||||
|
mapVal := val.MapIndex(key)
|
||||||
|
if mapVal.Type().Kind() == reflect.Ptr {
|
||||||
|
mapVal = reflect.Indirect(mapVal)
|
||||||
|
}
|
||||||
|
if k == "_id" {
|
||||||
|
val.SetMapIndex(key, convertIDValue(mapVal))
|
||||||
|
} else {
|
||||||
|
idToObjectID(mapVal.Interface())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
for key, data := range filter {
|
||||||
|
if key == "_id" {
|
||||||
|
if hex, ok := data.(string); ok {
|
||||||
|
filter[key] = bson.ObjectIdHex(hex)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch d := data.(type) {
|
||||||
|
case map[string]interface{}:
|
||||||
|
idToObjectID(d)
|
||||||
|
case bson.M:
|
||||||
|
idToObjectID(d)
|
||||||
|
case []map[string]interface{}:
|
||||||
|
for _, s := range d {
|
||||||
|
idToObjectID(s)
|
||||||
|
}
|
||||||
|
case []bson.M:
|
||||||
|
for _, s := range d {
|
||||||
|
idToObjectID(s)
|
||||||
|
}
|
||||||
|
case []interface{}:
|
||||||
|
for _, s := range d {
|
||||||
|
isToObjectID(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
// ReadCollection gets the filtered collection of the model
|
// ReadCollection gets the filtered collection of the model
|
||||||
func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, selector bson.M, offset int, limit int, sort []string, pipelineModifier PipelineModifierFunction) (err error) {
|
func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, selector bson.M, offset int, limit int, sort []string, pipelineModifier PipelineModifierFunction) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -116,6 +194,10 @@ func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, select
|
|||||||
} else {
|
} else {
|
||||||
// search without pipe is faster
|
// search without pipe is faster
|
||||||
|
|
||||||
|
idToObjectID(filter)
|
||||||
|
|
||||||
|
spew.Dump(filter)
|
||||||
|
|
||||||
q := c.Find(filter)
|
q := c.Find(filter)
|
||||||
if selector != nil {
|
if selector != nil {
|
||||||
q = q.Select(selector)
|
q = q.Select(selector)
|
||||||
|
Loading…
Reference in New Issue
Block a user