Я создаю пользовательские веб-сервисы, используя Golang (Go-Swagger для определения API) и Firestore в качестве хранилища документов. Все работает нормально, за исключением того, что становится "неловко" при обновлении базы данных. У меня есть решение, но я не уверен, что оно самое элегантное. Кто-нибудь еще сталкивался с этим, и как они решили это ...
Постановка проблемы : При записи в базу данных нулевые значения перезаписывают существующие значения в базе данных
Предлагаемое решение - В моем API есть json: «omitempty» для необязательных параметров, и в него будут переданы значения nil (в отличие от получения значений golang по умолчанию). Я планирую принять Struct, передаваемый в API, и по одному атрибуту за раз, заполняя его в моем Struct, который использует Firestore. У меня есть проблемы с производительностью, но я не хочу связывать мой API Struct с моим DB Struct. Я также собираюсь установить firestore: «omitempty» `строковый литерал в моей структуре firestore, очень похожий на API Struct. Я надеюсь, что это скажет firestore не писать значения, равные нулю.
Это лучший способ? Есть ли у них другие альтернативы? Значения по умолчанию golang, кажется, имеют свои плюсы и минусы.
ОБНОВЛЕНИЕ:
Я оказался в том же месте, что и предложенное мной решение, но также последовал предложению, которое предложил Дмитрий. Я создал объект [] firestore.Update, который будет содержать только те значения, которые я хочу обновить. Когда я вызывал firestore, он обновлял только эти значения.
Вот функция, которую я использую для вызова firestore.
func updateProfileUsingUpdateMethod(documentName string, values []firestore.Update) error {
ctx := context.Background()
app := firestorehelper.GetFirestoreApp()
client, err := app.Firestore(ctx)
if err != nil {
return err
}
defer client.Close()
//Set the updated date
wr, error := client.Doc(collectionName+"/"+documentName).Update(ctx, values)
if error != nil {
return error
}
fmt.Println(wr.UpdateTime)
//Assume success
return nil
}
Я также создаю объект firestore.Update и добавляю его к своему фрагменту [] firestore.Update.
firestore.Update{Path: "PATH_TO_ATTR", Value: VALUE_TO_PASS_IN}