Я пытаюсь декодировать DocumentResult в структуру, используя теги bson, и он не работает для пользовательского типа, заключающего в строку
С вашим текущим MyType
документом, которыйбудет храниться в MongoDB следующим образом:
{
"_id": ObjectId("..."),
"some_int": NumberLong("42"),
"some_string": "The Answer",
"custom_type": "ABCD"
}
Несмотря на то, что базовый тип - string
, это может быть сложно декодировать с текущей версией mongo-go-driver (v0.0.12) из-за переноса типа.
Однако, если вы хотите иметь собственный тип как таковой, вы можете вместо этого изменить структуру на встроенное поле .Например:
type MyDoc struct {
SomeInt int `bson:"some_int"`
SomeString string `bson:"some_string,omitempty"`
CustomType MyType `bson:"custom_type,omitempty"`
}
type MyType struct {
Value string `bson:"value,omitempty"`
}
var myType = MyType{Value: "ABCD"}
docToInsert := MyDoc{42, "The Answer", "ABCD"}
insertResult, err := collection.InsertOne(nil, docToInsert)
resultDoc := collection.FindOne(context.Background(), nil)
if err != nil {
log.Fatal(err)
}
elem := &MyDoc{}
err = resultDoc.Decode(elem)
if err != nil {
log.Fatal(err)
}
fmt.Println(elem.SomeInt, elem.SomeString, elem.CustomType.Value)
// 42 The Answer ABCD
Документ будет храниться в MongoDB, как показано ниже:
{
"_id": ObjectId("..."),
"some_int": NumberLong("42"),
"some_string": "The Answer",
"custom_type": {
"value": "ABCD"
}
}
В противном случае просто используйте тип string
напрямую, поскольку результирующий документ в базе данных будет таким жев качестве версии переноса типа:
type MyDoc struct {
SomeInt int `bson:"some_int"`
SomeString string `bson:"some_string,omitempty"`
CustomType string `bson:"custom_type,omitempty"`
}
Вы также можете найти MongoDB Data Modeling полезной ссылкой.