在mongodb go驱动程序中,如何将BSON封送/解封送到结构中

在mongodb go驱动程序中,如何将BSON封送/解封送到结构中,mongodb,go,Mongodb,Go,我是新的mongodb go司机。但是我被卡住了 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

我是新的mongodb go司机。但是我被卡住了

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]的内容时,它没有任何内容-全部为空

我的地图是这样的: m映射[字符串]语言

语言的定义如下:

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"`
}
我做错了什么


我正在使用以下示例学习:

官方MongoDB驱动程序使用objectid.objectid类型作为MongoDB objectid。这种类型是:

类型ObjectID[12]字节

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

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
}
更新: 最近进行了新的更改,现在必须更改为:

import "github.com/mongodb/mongo-go-driver/bson/primitive"

type Language struct {
    ID         primitive.ObjectID `bson:"_id,omitempty"` // omitempty to protect against zeroed _id insertion         
    Name       string   `json:"name" bson:"name"`
    Vowels     []string `json:"vowels" bson:"vowels"`
    Consonants []string `json:"consonants" bson:"consonants"`
}
并取ID值:

log.Println("lang id:", objLang.ID)
...
较新的“github.com/mongodb/mongo-driver”要求将对象ID定义为

type Application struct {
    ID      *primitive.ObjectID `json:"ID" bson:"_id,omitempty"`
}
这将序列化为JSON
“ID”:“5c362f3fa2533bad3b6cf6f0”
,下面是如何从insert结果中获取ID

if oid, ok := res.InsertedID.(primitive.ObjectID); ok {
    app.ID = &oid
}
从字符串转换

appID := "5c362f3fa2533bad3b6cf6f0"    
id, err := primitive.ObjectIDFromHex(appID)
if err != nil {
    return err
}
_, err = collection.DeleteOne(nil, bson.M{"_id": id})
转换成字符串

str_id := objId.Hex()
我正在

无法将objectID解码到数组中

所以我换了

ID接口{}`bson:“\u ID,省略empty”`


没有任何问题

光标。解码(e)
也返回错误。将其结果添加到您的问题编号中。如果我打印e,我会看到MongoDBi中的有效BSON数据,这意味着函数
Decode()
也会返回错误。在这里打印错误,如果不是零是的,您是对的
Decode(interface{})error
Decode
的定义,请问您真的需要从Mongodb签出_id吗?我注意到这个结构描述了JSON和BSON序列化。这感觉就像是从数据库中“获取”的同一个结构随后以JSON的形式呈现给用户,而不进行转换,本质上是将数据结构直接暴露给客户端。作为一个相对来说比较新的人,我真的很好奇这是否真的被认为是好的实践?这是惯用的围棋吗?我将把“这是惯用的围棋吗?”留给专家们回答。您可以始终使用
字段int json:“-”
来避免向有效的客户端发送字段,但这会将json序列化为
“ID”:{“Type”:7,“Value”:“XDYvP6JTO607bPbw”}