gpt4 book ai didi

go - 使用预先构造的字符串作为 bson.M 用于 go 中的 mgo 查询

转载 作者:IT王子 更新时间:2023-10-29 02:13:23 26 4
gpt4 key购买 nike

这里更大的目标是在 go 中设置更新查询,仅设置请求中发送给它的那些字段。

例如,我有一个文档要更新,我允许用户通过简单地在请求中指定它们来更新可变数量的字段 -

{
"field1": valueOfField1,
"field2": valueOfField2,
"field3": valueOfField3,
...
}

这里的问题是,当我使用 json.Decode 将此输入解码为具有大多数字段可选的自定义结构类型时,输入中不存在的值将保留为 nil

我的结构看起来像这样 -

type Fields struct {
Field1 string `bson:"field1" json:"field1,omitempty"`
Field2 string `bson:"field2" json:"field2"`
Field3 time.Time `bson:"field3,omitempty" json:"field3,omitempty"`
Field4 bool `bson:"field4,omitempty" json:"field4,omitempty"`
...
}

现在在我的更新查询中,我说,

bson.M{"$set": bson.M{"field1": body.Field1, "field2": body.Field2, "field3": body.Field3, "field4": body.Field4, ...}}

问题是,如果输入中不存在这些字段之一,它仍然会覆盖数据库中的现有值并使其为空。

为了避免这种情况,我希望这个 {"field1": body.Field1, "field2": body.Field2, "field3": body.Field3, "field4": body.Field4, . .. 部分是根据传入的字段动态构建的。

为此,我对输入做了一个 json.Marshal,就像这样 -

finalbody, err := json.Marshal(body)

然后我尝试在 $set 字段中使用它作为 -

bson.M{"$set": string(finalbody)}

当然,这给了我一个错误提示——“修饰符对字段进行操作,但我们找到了一个字符串”。该字符串与 bson.M 完全一样,只是它不是 bson.M 即 {"field1": valueOfField1, "field2": valueOfField2, "field3": valueOfField1, ...}

我哪里错了?[...代表'等等']

最佳答案

我通过将 finalbody 解码到 map[string]interface{} 中然后将其用作更新映射找到了解决方案。

所以,

finalbody, err := json.Marshal(body)
var finalbodymap map[string]interface{}
json.Unmarshal(finalbody, &finalbodymap)

当然,您需要添加一些错误处理,所以最终代码如下所示 -

finalbody, err := json.Marshal(body)
if err != nil {
log.Println(err)
return
}
var finalbodymap map[string]interface{}
if err = json.Unmarshal(finalbody, &finalbodymap); err != nil{
log.Println(err)
}

然后在更新查询中,我可以简单地写 -

bson.M{"$set": finalbodymap}

这里的一个问题是,在编码时,它会将任何 time.Time 类型值设置为 nil,即“0001-01-01T00:00:00Z”。我怀疑某些其他类型也可以观察到这种行为。

关于go - 使用预先构造的字符串作为 bson.M 用于 go 中的 mgo 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39447061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com