gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:23:45 26 4
gpt4 key购买 nike

当我尝试为 bson.M 创建自定义 mashler/unmashler 时,出现错误 WriteValueBytes can only write while positioned on a Element or Value but is positioned on a TopLevel

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

这是我目前的代码

package main

import (
"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"
"log"
)

// TransactionID is a UUID used to trace a batch of work which is being processed.
type TransactionID uuid.UUID

// String returns the transaction id as a string
func (id TransactionID) String() (result string, err error) {
val, err := uuid.FromBytes(id[:])
if err != nil {
return result, errors.Wrapf(err, "cannot convert transaction ID %s to UUID", string(id[:]))
}
return val.String(), nil
}

func (id TransactionID) MarshalBSONValue() (bsontype.Type, []byte, error) {
idString, err := id.String()
if err != nil {
return bsontype.String, nil, err
}
return bsontype.String, bsoncore.AppendString(nil, idString), nil
}


func (id *TransactionID) UnmarshalBSONValue(bsonType bsontype.Type, bytes []byte) error {
uid, err := uuid.FromBytes(bytes)
if err != nil {
return err
}

*id = TransactionID(uid)
return nil
}


func NewTransactionID() TransactionID {
return TransactionID(uuid.New())
}


func main() {
id := NewTransactionID()

_, err := bson.Marshal(id)
if err != nil {
log.Fatal(err)
}
}

我得到 WriteValueBytes can only write while positioned while positioned on Element or Value but positioned on TopLevel 在解码步骤中。

链接:https://play.golang.org/p/_n7VpX-KIyP

最佳答案

I'm getting the WriteValueBytes can only write while positioned on a Element or Value but is positioned on a TopLevel in the unmarshal step.

函数bson.Marshal()需要一个可以转换为文档的参数(即 interface{})。这就是错误消息与值的位置有关的原因。也就是说,你不能在文档的顶层有一个字符串,它必须是文档的一个元素。如果您需要编码单个值,您应该使用 bson.MarshalValue()反而。

id := NewTransactionID()
vtype, vdata, err := bson.MarshalValue(id)

下面是使用 bson.Marshal() 的示例(添加到您的示例中):

type Foo struct {
ID TransactionID
}

func main() {
id := NewTransactionID()
foo, err := bson.Marshal(&Foo{ID:id})
if err != nil {
panic(err)
}
}

关于mongodb - 为 Bson.M mongodb 创建自定义 mashler/unmashler 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61277830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com