我想以字符串形式获取 ObjectID,因为我有其他存储类型,所以我想避免在结构中使用 Primitive.ObjectID 来保持层独立。我是 Golang 新手,谢谢。
package listing
type Card struct {
ID string
Hanzi string
Pinyin string
Traducao string
}
Run Code Online (Sandbox Code Playgroud)
我的存储文件:包存储
func (m *Mongodb)GetCards() []*listing.Card {
var list []*listing.Card
collection := m.Client.Database("flashcards").Collection("cards")
cur, err := collection.Find(context.TODO(), bson.M{})
if err != nil {
log.Fatal("Erro buscando cards:", err)
}
for cur.Next(context.TODO()) {
var card listing.Card
err = cur.Decode(&card)
if err != nil {
log.Fatal("Erro decodificando documento", err)
}
list = append(list, &card)
}
return list
}
Run Code Online (Sandbox Code Playgroud)
和您一样,我一直在寻找一种解决方案来保持模块尽可能独立并保持较低的耦合级别。我绞尽脑汁,但最终我发现了这一点。我希望这是一个有效且清晰的解决方案。
您可以使用实现ValueMarshaler接口的自定义类型:因此您必须实现 MarshalValue func!
type Card struct {
ID MyObjectID `bson:"_id"`
CardSuit string `bson:"cardSuit"`
}
type MyObjectID string
func (id MyObjectID) MarshalBSONValue() (bsontype.Type, []byte, error) {
p, err := primitive.ObjectIDFromHex(string(id))
if err != nil {
return bsontype.Null, nil, err
}
return bson.MarshalValue(p)
}
Run Code Online (Sandbox Code Playgroud)
ID 实际上是一个string
,但是使用自定义编组器,它将在 Mongo 中保存为 ObjectID,并在解组期间正确解析。
这是一个工作示例,显然,您需要 mongo 才能使其运行。
好吧,我明白了。我创建了另一个结构体来保存 ObjectId
type HexId struct {
ID primitive.ObjectID `bson:"_id"`
}
Run Code Online (Sandbox Code Playgroud)
然后我使用 Hex() 将值传递给 Card.ID
err = cur.Decode(&card)
err = cur.Decode(&hexId)
card.ID = hexId.ID.Hex()
Run Code Online (Sandbox Code Playgroud)
现在我可以用它来建立链接。