2016-09-12 14 views
0

ここでの大きな目標は、更新クエリを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, ...}

どこが間違っていますか?

答えて

0

最終的なボディをアンマーシャリングして解決策をmap [string]インターフェイス{}に入れ、それをアップデートマップとして使用しました。

ので、もちろん

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} 

一つの問題マーシャリングながら、それはNIに任意のtime.Time型の値を設定するというものであったにもかかわらずすなわち「0001-01-01T00:00:00Z」となる。私はそのような行動が特定の他のタイプでも観察されると考えています。

関連する問題