为Bson.M mongodb创建自定义mashler/unmashler时出错

为Bson.M mongodb创建自定义mashler/unmashler时出错,mongodb,go,marshalling,unmarshalling,Mongodb,Go,Marshalling,Unmarshalling,当试图为bson.M创建自定义mashler/unmashler时,我发现错误WriteValueBytes只能在位于元素或值上时写入,但位于顶层 我有一个名为TransactionId的自定义类型,它表示一个UUID,我希望在存储到monbodb之前将该值转换为字符串,并在从mongodb提取值时将其从字符串转换回 这是我目前掌握的代码 主程序包 进口( “github.com/google/uuid” “github.com/pkg/errors” “go.mongodb.org/mongo

当试图为bson.M创建自定义mashler/unmashler时,我发现错误
WriteValueBytes只能在位于元素或值上时写入,但位于顶层

我有一个名为TransactionId的自定义类型,它表示一个UUID,我希望在存储到monbodb之前将该值转换为字符串,并在从mongodb提取值时将其从字符串转换回

这是我目前掌握的代码

主程序包
进口(
“github.com/google/uuid”
“github.com/pkg/errors”
“go.mongodb.org/mongo-driver/bson/bsontype”
“go.mongodb.org/mongo driver/x/bsonx/bsoncore”
“go.mongodb.org/mongo-driver/bson”
“日志”
)
//TransactionID是一个UUID,用于跟踪正在处理的一批工作。
类型TransactionID uuid.uuid
//String以字符串形式返回事务id
func(id TransactionID)字符串()(结果字符串,错误){
val,err:=uuid.FromBytes(id[:])
如果错误!=零{
返回结果,errors.Wrapf(错误,“无法将事务ID%s转换为UUID”,字符串(ID[:]))
}
返回val.String(),nil
}
func(id TransactionID)MarshallBSonValue()(bsontype.Type,[]字节,错误){
idString,err:=id.String()
如果错误!=零{
返回bsontype.String,nil,err
}
返回bsontype.String、bsoncore.AppendString(nil、idString)、nil
}
func(id*TransactionID)解组SALBSONvalue(bsonType bsonType.Type,bytes[]byte)错误{
uid,err:=uuid.FromBytes(字节)
如果错误!=零{
返回错误
}
*id=事务id(uid)
归零
}
func NewTransactionID()TransactionID{
返回TransactionID(uuid.New())
}
func main(){
id:=NewTransactionID()
_,err:=bson.Marshal(id)
如果错误!=零{
log.Fatal(错误)
}
}
我得到的
WriteValueBytes只能在位于元素或值上时写入,但在解组步骤中位于顶层

链接:

我得到的WriteValueBytes只能在位于元素或值上时写入,但在解组步骤中位于顶层

该函数需要一个可以转换为文档的参数(即
接口{}
)。这就是错误消息与值位置相关的原因。i、 e.文档的顶层不能有字符串,它必须是文档的一个元素。如果需要封送单个值,则应改为使用

id:=NewTransactionID()
vtype,vdata,错误:=bson.MarshallValue(id)
下面是使用
bson.Marshal()
的示例(添加到您的示例中):

类型Foo struct{
ID事务ID
}
func main(){
id:=NewTransactionID()
foo,err:=bson.Marshal(&foo{ID:ID})
如果错误!=零{
恐慌(错误)
}
}
我得到的WriteValueBytes只能在位于元素或值上时写入,但在解组步骤中位于顶层

该函数需要一个可以转换为文档的参数(即
接口{}
)。这就是错误消息与值位置相关的原因。i、 e.文档的顶层不能有字符串,它必须是文档的一个元素。如果需要封送单个值,则应改为使用

id:=NewTransactionID()
vtype,vdata,错误:=bson.MarshallValue(id)
下面是使用
bson.Marshal()
的示例(添加到您的示例中):

类型Foo struct{
ID事务ID
}
func main(){
id:=NewTransactionID()
foo,err:=bson.Marshal(&foo{ID:ID})
如果错误!=零{
恐慌(错误)
}
}

我正在努力理解这一点,但无法让它发挥作用。下面是一个更简单的错误示例,更接近我正在研究的内容:。在我的例子中,我定义的类型在转换为文档时应该没有问题,不是吗?我没有松散的绳子或类似的东西。我错过了什么?我一直在努力理解这一点,但无法让它发挥作用。下面是一个更简单的错误示例,更接近我正在研究的内容:。在我的例子中,我定义的类型在转换为文档时应该没有问题,不是吗?我没有松散的绳子或类似的东西。我错过了什么?