Десериализовать курсор в массив с помощью mongo-go-driver и интерфейса - PullRequest
0 голосов
/ 06 июня 2019

Я создаю API, используя golang, я хотел бы создать функциональный тест, для этого я создаю интерфейс для абстрагирования моей базы данных. Но для этого мне нужно иметь возможность преобразовывать курсор в массив, не зная типа.


func (self *KeyController) GetKey(c echo.Context) (err error) {
    var res []dto.Key
    err = db.Keys.Find(bson.M{}, 10, 0, &res)
    if err != nil {
        fmt.Println(err)
        return c.String(http.StatusInternalServerError, "internal error")
    }
    c.JSON(http.StatusOK, res)
    return
}
//THE FIND FUNCTION ON THE DB PACKAGE
func (s MongoCollection) Find(filter bson.M, limit int, offset int, res interface{}) (err error) {
    ctx := context.Background()
    var cursor *mongo.Cursor
    l := int64(limit)
    o := int64(offset)
    objectType := reflect.TypeOf(res).Elem()
    cursor, err = s.c.Find(ctx, filter, &options.FindOptions{
        Limit: &l,
        Skip:  &o,
    })

    if err != nil {
        return
    }

    defer cursor.Close(ctx)

    for cursor.Next(ctx) {
        result := reflect.New(objectType).Interface()
        err := cursor.Decode(&result)
        if err != nil {
            panic(err)
        }
        res = append(res.([]interface{}), result)

    }
    return
}


У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 08 июня 2019

Вы можете напрямую вызвать метод «Все»:

ctx := context.Background()
err = cursor.All(ctx, res)
if err != nil {
    fmt.Println(err.Error())
}

Для справки:

https://godoc.org/go.mongodb.org/mongo-driver/mongo#Cursor.All

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...