#mongodb #go
#mongodb #Вперед
Вопрос:
при использовании драйвера mgo от globalsign я мог бы сэкономить некоторое время, повторно используя функцию для возврата всех элементов из коллекции, независимо от того, какие модели я использовал.
Но теперь, с официальным драйвером от MongoDB, мне нужно указать, какой интерфейс я хочу декодировать, поэтому таким образом я не могу повторно использовать этот метод для других интерфейсов.
Кто-нибудь добрался до этого момента?
Функция, использующая драйвер 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)
}
Ответ №1:
Используйте курсор.Все в версии >= 1.1.0 драйвера:
var result []Example
err := cursor.All(amp;result)
if err != nil {
// handle error
}
Для более ранних версий,
используйте пакет 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()
}
Назовите это так:
var result []Example
err := decodeAll(cursor, amp;result)
if err != nil {
// handle error
}