一尘不染

在mongodb-go-driver中,如何将BSON编组/解组为结构

go

我是mongodb-go-driver的新手。但是我被困住了。

cursor, e := collection.Find(context.Background(), bson.NewDocument(bson.EC.String("name", id)))

for cursor.Next(context.Background()) {

    e := bson.NewDocument()
    cursor.Decode(e)

    b, _ := e.MarshalBSON()
    err := bson.Unmarshal(b, m[id])
}

查看m [id]的内容时,它没有内容-全部为null。

我的地图是这样的:m map [string] Language

语言定义如下:

type Language struct {
    ID         string   `json:"id" bson:"_id"`                   // is this wrong?
    Name       string   `json:"name" bson:"name"`
    Vowels     []string `json:"vowels" bson:"vowels"`
    Consonants []string `json:"consonants" bson:"consonants"`
}

我究竟做错了什么?

我正在使用此示例进行学习:https :
//github.com/mongodb/mongo-go-
driver/blob/master/examples/documentation_examples/examples.go


阅读 310

收藏
2020-07-02

共1个答案

一尘不染

正式的MongoDB驱动程序对MongoDB ObjectId使用objectid.ObjectID类型。此类型是:

type ObjectID [12]byte

因此,您需要将结构更改为:

type Language struct {
    ID         objectid.ObjectID   `json:"id" bson:"_id"`             
    Name       string   `json:"name" bson:"name"`
    Vowels     []string `json:"vowels" bson:"vowels"`
    Consonants []string `json:"consonants" bson:"consonants"`
}

我在以下方面取得了成功:

m := make(map[string]Language)
cursor, e := collection.Find(context.Background(), bson.NewDocument(bson.EC.String("name", id)))

for cursor.Next(context.Background()) {

    l := Language{}
    err := cursor.Decode(&l)
    if err != nil {
        //handle err
    }
    m[id] = l // you need to handle this in a for loop or something... I'm assuming there is only one result per id
}
2020-07-02