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

How to marshal json string to bson document for writing to MongoDB?

我正在查找的内容相当于 Document.parse()

在 golang 中,这允许我直接从 json 创建 bson 吗?我不想为编组创建中间 Go 结构

gopkg.in/mgo.v2/bson package has a function called UnmarshalJSON 完全符合您的要求。

data 参数应将 JSON 字符串作为 []byte 值。

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

UnmarshalJSON unmarshals a JSON value that may hold non-standard syntax as defined in BSON's extended JSON specification.

示例:

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)
}

不再有直接使用支持的库(例如 mongo-go-driver)执行此操作的方法。您需要根据 bson 规范编写自己的转换器。

mongo-go-driver 有一个函数 bson.UnmarshalExtJSON 可以完成这项工作。

示例如下:

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

I do not want to create intermediate Go structs for marshaling

如果您want/need创建中间 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, and as you can see it supports Extended JSON formats

您也可以访问 https://json-to-bson-map.netlify.app 来试用该模块。您可以粘贴一个 JSON 文档,然后查看输出的 Go BSON 结构。