go - 编码成 bson.Raw

标签 go marshalling bson mgo

使用 gopkg.in/mgo.v2/bson ,我想知道如何将 interface{} 值编码为 bson.Raw 类型的值。

The documentation对于 bson.Raw 状态:

Using this type it is possible to unmarshal or marshal values partially.

但是我找不到可以返回 bson.Raw 的 Marshal 函数。

我错过了什么?

我尝试做的事的例子:

package main

import (
    "fmt"

    "gopkg.in/mgo.v2/bson"
)

func main() {
    // How to avoid a MarshalRaw help function?
    raw, err := MarshalRaw("Hello world")
    if err != nil {
        panic(err)
    }

    fmt.Printf("%+v\n", raw)
}

func MarshalRaw(v interface{}) (*bson.Raw, error) {
    bin, err := bson.Marshal(struct{ Raw interface{} }{v})
    if err != nil {
        return nil, err
    }

    var raw struct{ Raw bson.Raw }
    err = bson.Unmarshal(bin, &raw)
    if err != nil {
        return nil, err
    }

    return &raw.Raw, nil
}

输出:

&{Kind:2 Data:[12 0 0 0 72 101 108 108 111 32 119 111 114 108 100 0]}

最佳答案

bson.Raw在编码和解码时用作值。

要将 interface{} 转换为 bson.Raw,首先要做的是对其进行编码,以便获得表示任何内容的纯文档数据正在编码:

    var value interface{} = bson.M{"some": "value"}
    data, err := bson.Marshal(value)
    if err != nil {
            log.Fatal(err)
    }

然后它可能将一个或多个字段解码为 bson.Raw 值:

    var doc struct{ Some bson.Raw }
    err = bson.Unmarshal(data, &doc)
    if err != nil {
            log.Fatal(err)
    }

甚至整个文档:

    var doc bson.Raw
    err = bson.Unmarshal(data, &doc)
    if err != nil {
            log.Fatal(err)
    }

如果你想要整个文档而不只是一个字段,你也可以使用这个快捷方式:

    doc := bson.Raw{3, data}

常量 3 表示 bson specification 中的文档, 它当然必须与提供的数据相匹配。由于 BSON 只支持顶层的文档,我们知道这一定是正确的。

关于go - 编码成 bson.Raw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25276884/

相关文章:

c# - 在 MongoDb + C# 中反序列化没有默认构造函数的对象

go - 如何为[]byte的json.Marshal获取空列表[]而不是null?

node.js - OrientJS:将二进制数据与 "normal"属性一起存储

java - 如何编码和解码对象类型字段?

c# - 尝试使用带有 GUID 的 C# 持久化的 mongodb 读取 nodejs 中的数据

c++ - 将 MongoDB 查询转换为 C++ 查询时遇到问题

go - 无效的ClientTokenId : The security token included in the request is invalid

go - 为 go.mod 文件指定 Go 版本

go - 怎么听N个 channel ? (动态选择语句)

c++ - 非类型模板参数……那是一个模板! (C++)