#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)