Как передать структуру декодирования mongodb в функцию

#mongodb #go

#mongodb #Вперед

Вопрос:

Decode Шаг следующего кода неправильно заполняет исходный document объект. Он перезаписывает ее bson объектом.

 func main() {
    c := Call{}
    dbGetObject("collection", amp;c)
}

func dbGetObject(collectionName string, document interface{}) (err error) {
    uri, creds, auth := dbGetAuth()

    clientOpts := options.Client().ApplyURI(uri).SetAuth(creds)
    client, err := mongo.Connect(context.TODO(), clientOpts)
    if err != nil {
        log.Fatal(err)
        return err
    }
    defer client.Disconnect(context.TODO())

    collection := client.Database(auth.Database).Collection(collectionName)

    err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(amp;document)
    if err != nil {
        log.Fatal(err)
        return err
    }

    return nil
}
  

Тем не менее, следующий код работает правильно:

 func dbGetObject(collectionName string) (err error) {
    uri, creds, auth := dbGetAuth()

    clientOpts := options.Client().ApplyURI(uri).SetAuth(creds)
    client, err := mongo.Connect(context.TODO(), clientOpts)
    if err != nil {
        log.Fatal(err)
        return err
    }
    defer client.Disconnect(context.TODO())

    collection := client.Database(auth.Database).Collection(collectionName)

    c := Call{}
    err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(amp;c)
    if err != nil {
        log.Fatal(err)
        return err
    }

    return nil
}
  

Единственное отличие заключается в том, что экземпляр структуры передается в функцию, а не создается в dbGetObject функции. Что я делаю не так?

Ответ №1:

В первом примере тип документа interface . если вы исправите тип аргумента, как показано ниже, он будет работать правильно.

 func dbGetObject(collectionName string, document *Call)
  

Комментарии:

1. Спасибо. Я намеренно передаю ее как интерфейс, потому что я буду вызывать ее с разными типами структур. Однако я только что понял, что происходит. В конечном итоге я передавал указатель на указатель в Decode вызов.

Ответ №2:

Я действительно понял, что происходит. При вызове функции, а затем для декодирования я передаю указатель. Итак, фактически он передает указатель на указатель в вызов Decode. Итак, исправление заключается в изменении вызова decode с:

 err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(amp;document)
  

Для

 err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(document)