2016-09-12 13 views
0

. Большей целью здесь является запрос на обновление в go, который устанавливает только те поля, которые отправляются ему в запросе.Используйте предварительно сконструированную строку как bson.M для запроса mgo в 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) 

а потом я пытаюсь использовать это в заданном поле $ а -

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

конечно это дает мне ошибку говоря - «Modifie rs работают с полями, но вместо этого мы нашли строку ". Строка совершенно так же, как и bson.M была бы за исключением того, что это не bson.M i.e {"field1": valueOfField1, "field2": valueOfField2, "field3": valueOfField1, ...}

Где я иду не так? [... представляет 'и т. Д.']

ответ

0

Я нашел решение Unmarshalling finalbody в интерфейсе карты [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} 

Один вопрос здесь, хотя в том, что в то время как кроссировки, он будет устанавливать какие-либо значения типа time.Time в п л, то есть "0001-01-01T00: 00: 00Z". Я подозреваю, что такое поведение можно наблюдать и с некоторыми другими типами.

 Смежные вопросы

  • Нет связанных вопросов^_^