Создать универсальную функцию - Официальный драйвер MongoDB - PullRequest
1 голос
/ 03 апреля 2019

при использовании драйвера 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 Ответ

4 голосов
/ 03 апреля 2019

Используйте пакет отражение для декодирования всех значений в срез:

// 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...