У меня есть несколько полей в одном документе, которые содержат пользовательские записи для мини-игр. После того, как пользователь сыграл несколько из них, я обновляю записи в этом документе. Мне нельзя разрешить перезаписать существующее значение записи меньшим. Поэтому мне нужно их максимизировать.
Рассмотренные мной решения:
- Транзакции . Это решение не работает для меня, потому что оно не будет работать без подключения Inte rnet.
- Cloud Functions . Я могу активировать функцию, когда документ обновляется или создается. Это решение работает для меня, но оно сильно усложняет лог c в моем приложении.
- Правила безопасности . Я могу предотвратить запись документа, если его новое значение меньше старого. Но это решение будет работать только в том случае, если вы будете писать по одному полю за раз.
В идеале я бы хотел что-то вроде следующего:
let data: [String: Any] = [
"game_id0": FieldValue.maximum(newRecord0),
"game_id1": FieldValue.maximum(newRecord1),
"game_id2": FieldValue.maximum(newRecord2),
]
let docRef = db.collection("user_records").document(documentId)
docRef.setData(data, merge: true)
Но, к сожалению, FieldValue
class есть только методы: increment
, arrayUnion
, arrayRemove
и delete
. В описании протокола я нашел максимальный и минимальный методы, но сомневаюсь, что это можно использовать на законных основаниях.
Может ли кто-нибудь подсказать мне какой-либо другой возможный метод?
UPD:
Пусть на сервере будет сохранен следующий документ:
{ "game_id": 13 }
Пользователь играет в игру с одного устройства (которое не в сети) и набирает 20 очков.
Затем тот же пользователь играет в ту же игру на другом устройстве (которое находится в сети) и набирает 22 очка. Отправлен запрос на обновление. Теперь сервер хранит следующую информацию:
{ "game_id": 22 }
На первом устройстве пользователя появляется Inte rnet и происходит запись. В этом случае происходит перезапись и документ принимает следующий вид:
{ "game_id": 20 }
То есть перезаписывается ранее собранная запись пользователя. Но мне нужно, чтобы запись происходила , только если новое значение больше текущего . То есть данные после шага два не должны меняться.