我是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]的内容时,它没有内容-全部为空。
我的地图是这样的: m map [string]语言
并且语言定义如下:
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
答案 0 :(得分:8)
较新的“ github.com/mongodb/mongo-go-driver”期望将对象ID定义为
type Application struct {
ID *primitive.ObjectID `json:"ID" bson:"_id,omitempty"`
}
这将序列化为JSON "ID":"5c362f3fa2533bad3b6cf6f0"
,这是从插入结果中获取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()
答案 1 :(得分:7)
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
}
答案 2 :(得分:1)
更新: 最近进行了新的更改,现在必须更改为:
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)
...
答案 3 :(得分:1)
我正在
cannot decode objectID into an array
所以我更改为
ID interface{} `bson:"_id,omitempty"`
没有任何问题