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

2023-12-24

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

我有一个名为 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 on a Element or Value but is positioned on a TopLevel在解组步骤中。

Link: https://play.golang.org/p/_n7VpX-KIyP https://play.golang.org/p/_n7VpX-KIyP


我发现 WriteValueBytes 只能在定位在元素或值上时写入,但在解组步骤中定位在顶层上。

功能bson.Marshal() https://pkg.go.dev/go.mongodb.org/mongo-driver/bson?tab=doc#Marshal需要一个可以转换为文档的参数(即interface{})。这就是错误消息与值的位置相关的原因。即,文档的顶层不能有字符串,它必须是文档的元素。如果您需要封送单个值,您应该使用bson.MarshalValue() https://pkg.go.dev/go.mongodb.org/mongo-driver/bson?tab=doc#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)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 Bson.M mongodb 创建自定义 mashler/unmashler 时出错 的相关文章

  • 护照本地猫鼬帐户注册的附加字段?

    我将 Passport local mongoose 与 Node js Express js MongoDB 一起用于 Web 应用程序 我想使用用户名字段 密码字段 公司名称字段和电话号码字段 所有字段 来注册用户作为字符串 但是 我只
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 我可以将 MongoDB 与实体框架一起使用吗?

    实体框架有可能支持MongoDB数据库吗 有人写过实体框架MongoDB Provider吗 简短的回答 不 这肯定是可能的 但不合理 MongoDB 是文档数据库 不支持集合之间的任何物理关系 EF 非常适合 SQL MySQL 等关系数
  • 了解新的 mongo id 并将其与 Iron-router 一起使用

    我有一个简单的帖子路线来寻找帖子 id 问题是pathFor助手创建这样的路径 ObjectID 52e16453431fc2fba4b6d6a8 我猜 mongoDB 插入已更改 现在 id对象在其内部包含另一个对象 称为 str 这是我
  • Mongod 错误(用自制程序安装)

    我已经安装了 mongodb brew install mongodb 已创建文件夹 mkdir p data db 处理权限 sudo chown R id un data db Run mongod 错误日志 2018 01 06T14
  • 如何在 mongoid 中使用 or 条件进行查询

    如何在 Mongoid 中使用 or 条件进行查询 这是 OR 在 mongoid 中查询 如果你想要像下面这样的查询 select from user where id 10 or name hitesh 在带有 mongoid 的 Ra
  • Mongoose 和 Promise:如何获取查询结果数组?

    使用猫鼬从数据库和 Q 中查询结果以获取承诺 但发现很难只获取可用用户列表 目前我有一些这样的东西 var checkForPerson function person people mongoose model Person Person
  • MongoDB 日志文件和 oplog 有什么不同?

    我最近开始使用 Mongodb 并尝试探索副本集和崩溃恢复 我读过它就像日志文件写入头重做日志文件一样 oplog 文件是每个写入活动都将被写入的文件 这两个有什么区别 我们在主站和从站上都有操作日志吗 请发布任何可以阐明该领域的网络链接
  • MongoClient:尝试使用 Mongoose 时未连接错误

    作为课程的一部分 我正在学习 MongoDB 现在正在学习 Mongoose 我已经完全按照课程中的方式编写了代码 但是当尝试使用node app js 我收到以下错误 node app js Output node 25772 Unhan
  • 使用 Node.js mongodb 本机调用 db.destroyDatabase 时,什么可能导致“拓扑被破坏”错误?

    我正在使用 Node js Mongodb 本机驱动程序运行一些集成测试 每个测试都涉及连接到数据库 验证它是否尚不存在 例如 没有任何带有文档的集合 运行测试 然后删除数据库 高级代码如下 const runSafeTest functi
  • Spring data 和 mongoDB - 继承和@DBRef

    我有这两份文件 用户 Document collection User public class User fields 和联系方式 Document collection Contact public class Contact exte
  • 非类型模板参数...那是模板! (C++)

    我基本上希望为通用 C 函数生成一个包装器 而无需手动指定类型 所以我有一个带有固定原型的回调 但我需要根据包装函数的类型在包装器中执行一些特殊代码 所以基本上我正在考虑在类模板中使用静态方法将我的函数包装到一致的接口 例如 this is
  • 用于全文搜索和 2 亿多条记录的数据库

    我即将创建一个包含至少 2 亿个条目的庞大数据库 数据库需要可使用全文进行搜索 并且速度应该很快 我的数据库从许多不同的数据源获取数据 我需要定期导入新的或更新的数据 将我的所有数据存储在像 mysql 这样的关系数据库中 然后创建一个 n
  • 错误:grid.mongo.GridStore不是构造函数,使用mongoose、Grid-fs-stream和grid multer存储

    我收到以下提到的错误 基本配置如下 我已经将文件上传到服务器上 我想下载它们但出现这些错误 我向 api files delete fileId 调用了 POST 请求 它应该调用路由并将文件返回给浏览器 而不是使用网格相关模块获取错误 M
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • Mongoose 查询执行后回调函数从未被调用

    以下是我的代码 mongoose connect mongodb localhost mydatabase var db mongoose connection db on error console error bind console
  • MongoDB中批量FindAndModify的解决方案

    我的用例如下 我在 mongoDB 中有一组文档 我必须发送这些文档进行分析 文件格式如下 id ObjectId 517e769164702dacea7c40d8 日期 1359911127494 状态 可用 其他字段 我有一个阅读器进程
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • 在 Meteor 应用程序中实现 MongoDB 2.4 的全文搜索

    我正在考虑向 Meteor 应用程序添加全文搜索 我知道 MongoDB 现在支持此功能 但我对实现有一些疑问 启用文本搜索功能的最佳方法是什么 textSearchEnabled true 在 Meteor 应用程序中 有没有办法添加索引

随机推荐

  • 如何在 Windows 上通过命令行以全屏视图打开 pdf?

    我可以使用以下命令通过命令行打开 pdf 文档 start test pdf 但我想通过命令行以全屏模式打开它 有人知道该怎么做吗 这应该可以做到 start max c nameofpdf pdf 这样做的优点是 如果用户使用非 adob
  • 如何从 pandas 数据帧计算 jaccard 相似度

    我有一个数据框如下 框架的形状是 1510 1399 列代表产品 行代表用户为给定产品分配的值 0 或 1 我怎样才能计算jaccard similarity scores 我创建了一个占位符数据框 列出了产品与产品 data ibs pd
  • AccessDenied:用户无权执行:cloudfront:CreateInvalidation

    我正在尝试使用 ember cli deploy 和 ember cli deploy cloudfront 将 ember 应用程序部署到 AWS CloudFront 我在 AWS 中设置了存储桶和用户 并为我的用户提供了 Amazon
  • 如何处理 Angular 2 中的模板错误(和其他错误)?

    当 Angular 2 中出现模板错误时 整个应用程序将无法工作 是否应该只有具有导致错误的模板的组件无法工作而应用程序的其余部分工作正常 如何处理错误以便应用程序在发生错误时不会停止响应 您可以使用自定义ErrorHandler http
  • 如何将 Kotlin 源文件转换为 Java 源文件

    我有一个 Kotlin 源文件 但我想将其转换为 Java 如何将 Kotlin 源代码转换为 Java 源代码 正如 Vadzim 所说 在 IntelliJ 或 Android Studio 中 您只需执行以下操作即可从 kotlin
  • 如何使用 View 的子级制作绘图动画,逐条绘制每条 Path 的线条?

    使用我在中找到的代码这个 StackOverflow 答案 https stackoverflow com a 61843394 3692177我成功地可以用手指在画布上绘制任何内容 并且在绘制时我会看到我绘制的内容 由此 我想创建一个在按
  • 来自守护程序的错误响应:未找到网络 myapp

    我正在尝试在多主机网络中创建一个容器 但在创建时出现此错误 Error response from daemon network myapp not found Here myapp是我创建的覆盖网络的名称 我正在使用的命令是 sudo d
  • Xcode 4 内部编译器错误:总线错误

    Xcode 4 0 1 开始出现内部编译器错误 它只是说 总线错误 它出现在我的一个 m 文件的底部 该文件现在几乎有 4000 行长 我看过这个问题 https stackoverflow com questions 5042256 in
  • StructureMap 和扫描组件

    因此 我有一个使用 StructureMap 的 NET 解决方案 并且我想让 StructureMap 读取一个外部程序集 该程序集实现该解决方案中项目的接口并为其定义注册表项 我的解决方案的 StructreMap 配置 ObjectF
  • 外部文件中的 JavaScript 未加载

    我有一个 JavaScript 问题 这个问题已经困扰我很长一段时间了 我有一个名为 search js 的外部文件 它与加载的 html 文件位于同一文件夹中 我在 HTML 中用来加载 javascript 文件的代码是 从我读过的所有
  • Postgres 函数总是返回一行

    我在 Postgres 中编写了以下函数 但遇到了一个问题 它总是返回一行 我的意思是 当没有用户匹配该对时 它会返回所有列为空的行 有没有办法让函数在没有结果时返回 0 零 行 CREATE OR REPLACE FUNCTION fin
  • Angular 2 全局常量提供程序注入器方法

    我有一个全局常量 例如根目录 我希望每个组件都可以访问它 在另一个 stackoverflow 问题中 答案是创建一个常量类并将其导入到每个组件中 有没有一种方法可以引导常量类 以便应用程序中的每个组件都可以访问它而无需任何额外的导入 到目
  • PHP:if (!$val) VS if (empty($val))。有什么区别吗?

    我想知道下面两种情况有什么区别 推荐哪一种 val 0 if val True if empty val It s also True 看看PHP类型对照表 http php net manual en types comparisons
  • @QueryParam 如何将没有值的参数转换为布尔值“false”?

    我想使用像这样的网址http www example com rest foo bar哪里的bar查询参数没有值 它的存在本身就应该表明变量是否是true or false 目前缺失值被假设为 空 并传递给new Boolean 将其视为f
  • XML(带有命名空间)到对象解组

    我从 Web 服务调用得到了以下响应 我尝试使用 JAXB 对其进行解组以将其映射到 java 类 这样做时我遇到了 unmarshal 异常
  • 使用扫描仪时无限循环? [复制]

    这个问题在这里已经有答案了 boolean z false do try a sc nextInt z true catch Exception e while z 尝试这个 如果您第一次尝试使用整数 它会正确执行 但是 如果您输入错误的文
  • Firebase orderByChild 和 equalTo() 查询不起作用

    我正在使用以下 Firebase 数据库表开发 Android 应用程序 posts id 1 author google 111527135678918251124 color 2960686 creationTime 142710414
  • aws cli get 错误“请求中包含的安全令牌无效”

    I did aws configure并测试它之前是否有效 但今天没用 我在尝试获取托管区域时收到错误 aws route53 list hosted zones An error occurred InvalidClientTokenId
  • Hudson 不会从 Git 获取

    我已经打了一天多了 这让我发疯了 我在Win7 PC上安装了Git 并选择 PuttyGen 选项 安装 我已经生成了 ssh 密钥 使用 PuttyGen 我已经添加了ssh 密钥到我的 Git 帐户 并链接 选美比赛中的私钥 我已经设置
  • 为 Bson.M mongodb 创建自定义 mashler/unmashler 时出错

    我收到错误WriteValueBytes can only write while positioned on a Element or Value but is positioned on a TopLevel当尝试为 bson M 创建