Как максимизировать существующее числовое поле в Cloud Firestore - PullRequest
1 голос
/ 07 августа 2020

У меня есть несколько полей в одном документе, которые содержат пользовательские записи для мини-игр. После того, как пользователь сыграл несколько из них, я обновляю записи в этом документе. Мне нельзя разрешить перезаписать существующее значение записи меньшим. Поэтому мне нужно их максимизировать.

Рассмотренные мной решения:

  1. Транзакции . Это решение не работает для меня, потому что оно не будет работать без подключения Inte rnet.
  2. Cloud Functions . Я могу активировать функцию, когда документ обновляется или создается. Это решение работает для меня, но оно сильно усложняет лог c в моем приложении.
  3. Правила безопасности . Я могу предотвратить запись документа, если его новое значение меньше старого. Но это решение будет работать только в том случае, если вы будете писать по одному полю за раз.

В идеале я бы хотел что-то вроде следующего:

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 }

То есть перезаписывается ранее собранная запись пользователя. Но мне нужно, чтобы запись происходила , только если новое значение больше текущего . То есть данные после шага два не должны меняться.

1 Ответ

1 голос
/ 07 августа 2020

Если вы не можете использовать транзакцию (что обычно было бы правильным), тогда вы должны использовать один из других ваших методов. Не думаю, что у вас есть альтернативы. Вам, вероятно, будет легче работать с Cloud Functions, и я не думаю, что это усложнит ситуацию так сильно, как вы говорите. Это должно быть всего несколько строк кода, чтобы проверить, что любое обновленное значение не должно быть меньше существующих значений.

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