首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bson.Raw元帅

bson.Raw元帅
EN

Stack Overflow用户
提问于 2014-08-13 01:54:56
回答 3查看 8.2K关注 0票数 2

使用gopkg.in/mgo.v2/bson,我想知道如何将接口{}值编组成bson.Raw类型的值。

文献资料 for bson.Raw声明:

使用这种类型,可以部分地解除封送或封送值。

但我找不到返回bson.Raw的元帅函数。

我遗漏了什么?

我尝试做的事情的例子:

代码语言:javascript
复制
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
}

输出:

和{类别:2数据:12 0 0 0 72 101 108 108 111 32 119 111 114 108 100 }

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-13 13:28:48

bson.Raw在封送和解封送处理时都用作值。

要将interface{}转换为bson.Raw,首先要做的事情是封送它,以便您获得表示正在封送的任何内容的普通文档数据:

代码语言:javascript
复制
    var value interface{} = bson.M{"some": "value"}
    data, err := bson.Marshal(value)
    if err != nil {
            log.Fatal(err)
    }

然后,它可能有一个或多个字段被解封为bson.Raw值:

代码语言:javascript
复制
    var doc struct{ Some bson.Raw }
    err = bson.Unmarshal(data, &doc)
    if err != nil {
            log.Fatal(err)
    }

甚至整个文件:

代码语言:javascript
复制
    var doc bson.Raw
    err = bson.Unmarshal(data, &doc)
    if err != nil {
            log.Fatal(err)
    }

如果您想要的是整个文档,而不仅仅是一个字段,还可以使用以下快捷方式:

代码语言:javascript
复制
    doc := bson.Raw{3, data}

3常量表示bson规范中的一个文档,当然它必须与提供的数据匹配。因为BSON只支持顶层的文档,我们知道这是正确的。

票数 3
EN

Stack Overflow用户

发布于 2014-08-13 02:29:22

我相信bson.Raw被用来作为变量的类型。

例如:(在中)

代码语言:javascript
复制
type Bar struct {
   AnInt int
   AString bson.Raw
}

"AString“字段将保留在链接提到的bson.Raw结构中。

如果您想部分解码嵌套结构的顶层以确定其实际类型,那么这是非常有用的,这样您就可以将其余的解析成正确的数据类型。

请注意,上面的测试是未经测试的,不是在一台我可以实际运行的机器前面进行的。这是基于这样的假设,即它的工作方式类似于标准的编码/json包。

票数 2
EN

Stack Overflow用户

发布于 2022-04-26 12:26:39

我想找的解决方案

代码语言:javascript
复制
m := bson.M{"ns": bson.M{"coll": "test1", "db": "testdb"}}
data, _ := bson.Marshal(m)
r := bson.Raw(data)
coll := r.Lookup("ns", "coll").StringValue()
println(coll)

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25276884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档