Лучшие практики игнорирования нулевых значений в Firestore - PullRequest
0 голосов
/ 02 января 2019

Я создаю пользовательские веб-сервисы, используя 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}

1 Ответ

0 голосов
/ 02 января 2019

У вас есть два варианта:

  1. Использование map[string]interface{}
  2. Использовать пользовательскую структуру с атрибутом firestore - firestore:"FieldName,omitempty".

    _, err: = client.Collection ("towns"). Doc ("DC"). Set (ctx, map [string] interface {} { «капитал»: правда, }, firestore.MergeAll) если ошибаться! = ноль { // Обрабатываем любые ошибки соответствующим образом, например, возвращаем их. log.Printf («Произошла ошибка:% s», ошибка) }

Не путайте json omitempty с firestore.

Вы также должны указать имя поля, так как этот синтаксис будет использовать omitempty в качестве имени.

firestore:"omitempty" - not correct

https://firebase.google.com/docs/firestore/manage-data/add-data

код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...