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