【问题标题】:Use a pre-constructed string as bson.M for mgo query in go在 go 中使用预先构造的字符串作为 bson.M 进行 mgo 查询
【发布时间】:2016-09-15 14:26:41
【问题描述】:

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

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

{
"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, ...}

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

【问题讨论】:

    标签: go marshalling bson mgo gorilla


    【解决方案1】:

    我通过将 finalbody Unmarshalling into a 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 类型值设置为零,即“0001-01-01T00:00:00Z”。我怀疑某些其他类型也可以观察到这种行为。

    【讨论】:

    • 嘿,伙计,你做得很好!
    猜你喜欢
    • 2015-02-04
    • 2016-07-21
    • 2015-01-11
    • 1970-01-01
    • 2019-08-16
    • 2018-10-19
    • 2021-04-19
    • 2013-07-21
    • 2013-02-01
    相关资源
    最近更新 更多