如何将json字符串编组为bson文档以写入MongoDB?

ifsvaxew  于 2022-11-22  发布在  Go
关注(0)|答案(5)|浏览(154)

我正在寻找的是等同于Document.parse()
在golang中,这允许我直接从json创建bson?我不想创建中间的Go语言结构体来进行封送处理

gv8xihay

gv8xihay1#

gopkg.in/mgo.v2/bson包有一个名为UnmarshalJSON的函数,它完全可以完成您想要的任务。
data参数应将JSON字符串保存为[]byte值。

func UnmarshalJSON(data []byte, value interface{}) error

UnmarshalJSON对可能包含BSON扩展JSON规范中定义的非标准语法的JSON值进行解组。
示例:

var bdoc interface{}
err = bson.UnmarshalJSON([]byte(`{"id": 1,"name": "A green door","price": 12.50,"tags": ["home", "green"]}`),&bdoc)
if err != nil {
    panic(err)
}
err = c.Insert(&bdoc)

if err != nil {
    panic(err)
}
zdwk9cvp

zdwk9cvp2#

mongo-go-driver有一个函数bson.UnmarshalExtJSON来完成这项工作。
下面是一个例子:

var doc interface{}
err := bson.UnmarshalExtJSON([]byte(`{"foo":"bar"}`), true, &doc)
if err != nil {
    // handle error
}
b4qexyjb

b4qexyjb3#

现在已经没有办法直接使用支持的库(例如mongo-go-driver)来实现这一点了,你需要根据bson规范编写自己的转换器。
编辑:这里有一个到目前为止已经在prod.https://github.com/dustinevan/mongo/blob/main/bsoncv/bsoncv.go中使用了几TB

xlpyo6sf

xlpyo6sf4#

我不想为封送处理创建中间Go语言结构体
如果你想/需要创建一个中间的Go BSON结构体,你可以使用一个转换模块,比如github.com/sindbach/json-to-bson-go

import (
    "fmt"
    "github.com/sindbach/json-to-bson-go/convert"
    "github.com/sindbach/json-to-bson-go/options"
)

func main() {
    doc := `{"foo": "buildfest", "bar": {"$numberDecimal":"2021"} }`
    opt := options.NewOptions()
    result, _ := convert.Convert([]byte(doc), opt)
    fmt.Println(result)
}

将产生输出:

package main

import "go.mongodb.org/mongo-driver/bson/primitive"

type Example struct {
    Foo string               `bson:"foo"`
    Bar primitive.Decimal128 `bson:"bar"`
}

该模块与the official MongoDB Go driver兼容,并且如您所见,它支持Extended JSON formats
您也可以访问https://json-to-bson-map.netlify.app来尝试运行该模块,您可以粘贴一个JSON文档,然后看到输出的Go BSON结构体。

g6baxovj

g6baxovj5#

使用go.mongodb.org/mongo-driver/bson/bsonrw的简单转换器:

func JsonToBson(message []byte) ([]byte, error) {
    reader, err := bsonrw.NewExtJSONValueReader(bytes.NewReader(message), true)
    if err != nil {
        return []byte{}, err
    }
    buf := &bytes.Buffer{}
    writer, _ := bsonrw.NewBSONValueWriter(buf)
    err = bsonrw.Copier{}.CopyDocument(writer, reader)
    if err != nil {
        return []byte{}, err
    }
    marshaled := buf.Bytes()
    return marshaled, nil
}

相关问题