mongodb - Mongo FindOne 和界面{}

标签 mongodb go

编辑:已解决,请参阅第一个答案。应该真的注意到,当我创建这个例子时..

我正在尝试创建一个采用接口(interface)而不是特定类型并调用 FindOne 函数的函数。有谁知道为什么 printFirstTrainerByInterface 函数不能正常工作?

我正在使用官方的 Go Mongo-Driver 和来自 mongodb-go-driver-tutorial 的示例片段.

package main

import (
    "context"
    "fmt"
    "log"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type Trainer struct {
    Name string
    Age  int
    City string
}

var db *mongo.Database

func main() {
    opts := options.Client().ApplyURI("mongodb://localhost:27017")
    client, err := mongo.Connect(context.TODO(), opts)
    if err != nil {
        log.Fatal(err)
    }
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }
    db = client.Database("test")
    insertTestDocument()

    var result Trainer
    printFirstTrainer(result)

    var result2 Trainer
    printFirstTrainerByInterface(&result2)
}

func insertTestDocument() {
    ash := Trainer{"Ash", 10, "Pallet Town"}
    res, err := db.Collection("trainers").InsertOne(context.TODO(), ash)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Inserted a test document: ", res.InsertedID)
}

func printFirstTrainer(result Trainer) {
    collection := db.Collection("trainers")
    err := collection.FindOne(context.TODO(), bson.M{}).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Found a single document: %+v\n", result)
}

func printFirstTrainerByInterface(result interface{}) {
    collection := db.Collection("trainers")
    err := collection.FindOne(context.TODO(), bson.M{}).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Found a single document: %+v\n", result)
}

输出:
Inserted a test document:  ObjectID("5e8216f74f41a13f01061d61")
Found a single document: {Name:Ash Age:10 City:Pallet Town}
Found a single document: [{Key:_id Value:ObjectID("5e8216f74f41a13f01061d61")} {Key:name Value:Ash} {Key:age Value:10} {Key:city Value:Pallet Town}]

最佳答案

您将要解码的结构的地址作为接口(interface)传递。您必须将其作为参数传递给解码,而不是接口(interface)的地址。尝试:

err := collection.FindOne(context.TODO(), bson.M{}).Decode(result)

关于mongodb - Mongo FindOne 和界面{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60934796/

相关文章:

MongoDB最佳实践: nesting

go - 从文件中读取字节到内存中

go - 是否可以在 Golang 中获取有关调用者函数的信息?

mongodb - mongodb 和 cassandra 的 Docker 健康检查总是失败

Mongodb 副本集 - 始终显示 "syncingTo"

sql - 如何在数据库中高效存储大型不断变化的瓦片 map

go - 尝试在Go中设置Cookie,但收到一条CORS错误,指出Access-Control-Allow-Credentials未设置为true

go - 如何用golang直接画到树莓派屏幕上

php - Golang vs PHP https 调用具有不同的 header 结果

python - $graphLookup 管道阶段后过滤结果