Очень маловероятно, что сервер баз данных ведет себя по-разному для 1% ваших пользователей.Гораздо более вероятно, что есть небольшая разница в вызовах, которые совершает 1% ваших пользователей.Трудно быть уверенным в том, что это отличие от кода, которым вы поделились, поэтому ниже приведено обоснованное предположение в надежде быстро разблокировать вас.
Вы говорите, что делаете:
contactsRef.child(targetUID).child(contactID).update(contactObj);
Ожидается: update()
должен только обновлять передаваемые ему поля записи.
Это немного неуловимо, и, к сожалению, вы не показываете, как вы строите contactObj
.Поэтому я приведу пример.Скажем, вы начинаете с JSON:
"uid1": {
"name": "unknown",
"id": -1,
"full_name": "unknown",
"metadata": {
"last_seen": "20 minutes ago",
"reputation" 56
}
}
И запускаете это в этом месте:
ref.update{
"name": "miles_b",
"id": 2687721
}
В этом случае только свойства name
и id
в ref
обновляются.Другие свойства не изменены, поэтому вы получите:
"uid1": {
"name": "miles_b",
"id": 2687721,
"full_name": "unknown",
"metadata": {
"last_seen": "20 minutes ago",
"reputation" 56
}
}
Но теперь скажите, что вы также хотите обновить metadata/reputation
.Вы можете подумать, что это работает:
ref.update{
"name": "miles_b",
"id": 2687721,
"metadata": {
"reputation": 61
}
}
Но здесь вы говорите базе данных заменить metadata
на предоставленный вами объект.В результате получается:
"uid1": {
"name": "miles_b",
"id": 2687721,
"full_name": "unknown",
"metadata": {
"reputation" 61
}
}
И это означает, что last_seen
теперь удалено из базы данных.
Чтобы обновить вложенное свойство, включите его полный путь в ключ.Итак:
ref.update{
"name": "miles_b",
"id": 2687721,
"metadata/reputation": 61
}
И с этим, вы будете сохранять metadata/last_seen
при обновлении metadata/reputation
:
"uid1": {
"name": "miles_b",
"id": 2687721,
"full_name": "unknown",
"metadata": {
"last_seen": "20 minutes ago",
"reputation" 61
}
}