. Большей целью здесь является запрос на обновление в 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, ...}
Где я иду не так? [... представляет 'и т. Д.']