将文档插入 mongodb,其中一个字段具有动态结构

我正在尝试使用 Go 插入 MongoDB,其中一个字段将具有动态数据。就我而言,它将通过 gRPC 来自其他服务,但我将示例简化为:


package main


import (

    "context"

    "fmt"

    _struct "github.com/golang/protobuf/ptypes/struct"

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

    "go.mongodb.org/mongo-driver/mongo"

    "go.mongodb.org/mongo-driver/mongo/options"

    "log"

)


type siteItem struct {

    ID   primitive.ObjectID `bson:"_id,omitempty"`

    Name string             `bson:"name"`


    // Data string     `bson:"data"`

    Data *_struct.Value `bson:"data"`

}


func main() {

    client, _ := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))

    client.Connect(context.TODO())

    collection := client.Database("site").Collection("sites")


    data := siteItem{

        Name: "Test name",


        // Data: "Test data",

        Data: &_struct.Value{

            Kind: &_struct.Value_StringValue{

                StringValue: "String from struct",

            },

        },

    }


    res, err := collection.InsertOne(context.Background(), data)

    if err != nil {

        log.Fatal(err)

    }


    fmt.Println(res)

}

我得到一个错误:cannot transform type main.siteItem to a BSON Document: no encoder found for structpb.isValue_Kind


如果我使用string而不是*_struct.Value- 它工作得很好。但在我的情况下Data:,可能有来自 JSON 的任何价值。


RISEBY
浏览 168回答 1
1回答

扬帆大鱼

解决此问题的一种方法是使用 bson 标签标记结构,这并不总是可行的。根据情况,我使用以下方法之一处理了这种情况:使用map[string]interface{}和 JSON 编组:type Item struct {   Data map[string]interface{} `bson:"data"`}...// Writing to dbdata,_:=json.Marshal(someStruct)json.Unmarshal(data,&item.Data)// Reading from dbdata,_:=json.Marshal(item.Data)json.Unmarshal(data,&result.Data)Data通过声明为 string而不是存储原始 JSON 数据map[string]interface{}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go