为了账号安全,请及时绑定邮箱和手机立即绑定

如何将mongodb解码结构传递给函数

如何将mongodb解码结构传递给函数

Go
繁华开满天机 2022-07-11 16:57:56
Decode以下代码的步骤未正确填充原始对象document。它用一个bson对象覆盖它。func main() {    c := Call{}    dbGetObject("collection", &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(&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(&c)    if err != nil {        log.Fatal(err)        return err    }    return nil}唯一的区别是结构的实例被传递到函数中而不是在函数中实例化dbGetObject。我究竟做错了什么
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

我真的意识到发生了什么。在调用函数然后调用解码时,我传递了一个指针。所以,它实际上是在将一个指针传递给解码调用。所以解决方法是改变解码调用:

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

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


查看完整回答
反对 回复 2022-07-11
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

在第一个示例中,文档的类型是interface. 如果您将参数类型固定如下,它将正常工作。

func dbGetObject(collectionName string, document *Call)


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信