当使用来自globalsign的mgo驱动程序时,无论我使用什么模型,我都可以节省一些时间来重新使用函数以返回集合中的所有元素。
但是现在,使用MongoDB的Official Driver,我需要具体说明我要解码的接口,因此无法将这种方法用于其他接口。
有人到这一点吗?
使用mgo驱动程序的功能:
func ReturnAll(collection string, model interface{}, skip int, limit int) error {
session := GetSession()
defer session.Close()
return session.DB(DBName).C(collection).Find(nil).Skip(skip).Limit(limit).All(modelo)
}
答案 0 :(得分:4)
使用reflect包将所有值解码为片:
// decodeAll decodes all values to the slice pointed to by result.
func decodeAll(cur *mongo.Cursor, result interface{}) error {
rv := reflect.ValueOf(result).Elem()
// reset to beginning of the slice.
sv := rv.Slice(0, rv.Cap())
for cur.Next(context.Background()) {
// Allocate new element value and decode to it.
pev := reflect.New(sv.Type().Elem())
if err := cur.Decode(pev.Interface()); err != nil {
return err
}
// Append the element value.
sv = reflect.Append(sv, pev.Elem())
}
rv.Set(sv)
return cur.Err()
}