ここでの大きな目標は、更新クエリをgoで実行することです。例えばのためにmgoクエリ用のbson.Mとして事前に作成された文字列を使用してください。
、私は、ユーザーが単にそのようなリクエストでそれらを指定することによって、フィールドの可変数を更新できるようにしていますどこ更新する文書を持っている -
{
"field1": valueOfField1,
"field2": valueOfField2,
"field3": valueOfField3,
...
}
ここでの問題は、そのとき、私ですjson.Decode
を使用してこの入力をデコードすると、ほとんどのフィールドがオプションのカスタム構造体型にデコードされ、入力に存在しない値はnil
となります。
私の構造体は、このようになります -
bson.M{"$set": bson.M{"field1": body.Field1, "field2": body.Field2, "field3": body.Field3, "field4": body.Field4, ...}}
問題があり、
は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"`
...
}
が今私の更新クエリでは、私が言うこれらのフィールドのいずれかが入力に存在しない場合に、それ既存の値をデータベースに上書きしてnullにします。これを避けるために
、私は、理想的には、この{"field1": body.Field1, "field2": body.Field2, "field3": body.Field3, "field4": body.Field4, ...}
部分を動的に来てフィールドに応じて構成されていることがしたいと思う
ことを行うには、私はそうのように、入力のjson.Marshal
をした - 。
finalbody, err := json.Marshal(body)
そして私はとの$ setフィールド内にこれを使用しようとしています - 「Modifie - これは私に言ってエラーになります。もちろん、
bson.M{"$set": string(finalbody)}
rsはフィールド上で動作しますが、代わりに文字列が見つかりました "。 文字列はbson.Mとまったく同じですが、bson.Mではないことを除いてはMです。つまり{"field1": valueOfField1, "field2": valueOfField2, "field3": valueOfField1, ...}
どこが間違っていますか?