为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
RISEBY 2022-05-18 16:25:52
我正在尝试使用 Go 插入 MongoDB,其中一个字段将具有动态数据。就我而言,它将通过 gRPC 来自其他服务,但我将示例简化为:package mainimport (    "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 的任何价值。
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

解决此问题的一种方法是使用 bson 标签标记结构,这并不总是可行的。根据情况,我使用以下方法之一处理了这种情况:


使用map[string]interface{}和 JSON 编组:

type Item struct {

   Data map[string]interface{} `bson:"data"`

}


...

// Writing to db

data,_:=json.Marshal(someStruct)

json.Unmarshal(data,&item.Data)

// Reading from db

data,_:=json.Marshal(item.Data)

json.Unmarshal(data,&result.Data)

Data通过声明为 string而不是存储原始 JSON 数据map[string]interface{}


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信