如何从 mongo-go-driver 游标获取 String 形式的 ObjectID?

Bru*_*gia 6 go bson mongo-go

我想以字符串形式获取 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)

Cir*_*i94 6

和您一样,我一直在寻找一种解决方案来保持模块尽可能独立并保持较低的耦合级别。我绞尽脑汁,但最终我发现了这一点。我希望这是一个有效且清晰的解决方案。

您可以使用实现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 才能使其运行。

对我有帮助的相关问题。


Bru*_*gia 1

好吧,我明白了。我创建了另一个结构体来保存 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)

现在我可以用它来建立链接。