Firestore SetOptions.mergeFields не хранит поле

Итак, у меня есть эта функция для сохранения пользователя в Firestore после его успешной регистрации.

//User class
id: String
email: String?
displayName: String?
photoUrl: String?

//updateOrInsertUser method
collectionReference.document(user.id)
            .set(
                user,
                SetOptions.mergeFields(
                    FIELD_photoUrl,
                    FIELD_email,
                    FIELD_displayName
                )
            )

Но когда я вызываю updateOrInsertUser(user), в Firestore сохраняются только поля из SetOptions, поэтому id не сохраняется.

Есть ли простой способ переопределить старые значения, определенные вSetOptionsесли документ уже существует, а если документа нет, хранить все? Я не хочу получать старый документ перед обновлением :(

Нет, я не хочу добавлять id в SetOptions (представьте себе другие варианты использования, когда вы не хотите переопределять поле, которое уже существует в базе данных)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
128
1

Ответы 1

But when I call updateOrInsertUser(user) only fields that are in SetOptions are stored in firestore, therefore id is not stored.

Это нормальное поведение, поскольку вы не передаете идентификатор методу SetOptions mergeFields().

Is there a simple way to override old values defined in SetOptions if the document already exists and if there is not doc store everything? I don't want to fetch old document before updating :(

Самый простой способ - получить «старый» документ, изменить его значения и записать его обратно в базу данных, но есть и другой подход, который может помочь вам изменить значения в документе, и это с помощью Map вместе с update(). вызов метода. В коде это может выглядеть так:

Map<String, Object> user = new HashMap<>();
user.put("photoUrl", FIELD_photoUrl);
user.put("email", FIELD_email);
user.put("displayName", FIELD_displayName);
userDocumentReference.update(user);

Привет, свкака! Если вы считаете, что мой ответ вам помог, примите его, нажав на галочку (✔️) слева под стрелками голосования. Должен поменять цвет на зеленый. Я бы оценил это. Спасибо!

Alex Mamo 13.05.2019 08:23

Другие вопросы по теме