我正在尝试使用 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{}
- 1 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消