Может ли транзакция использоваться в коллекции? - PullRequest
0 голосов
/ 24 февраля 2019

Я использую Firestore и пытаюсь удалить условие гонки в приложении Flutter с помощью транзакции использования.

У меня есть подколлекция, в которой максимум 2 документа добавляются.

Состояние гонки означает, что может быть более 2 документовдобавьте, потому что клиентский код использует setData.Например:

Firestore.instance.collection(‘collection').document('document').collection('subCollection’).document(subCollectionDocument2).setData({
  ‘document2’: documentName,
});

Я пытаюсь использовать транзакцию, чтобы убедиться, что добавлено максимум 2 документа.Таким образом, если коллекция была изменена (например, новый документ добавлен в коллекцию) во время выполнения транзакции, транзакция завершится неудачей.

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

Например, если попытаться реализовать:

Firestore.instance.collection(‘collection').document('document').collection('subCollection').runTransaction((transaction) async {

}),

Дать ошибку:

ошибка: метод 'runTransaction' не определендля класса 'CollectionReference'.

Может ли транзакция использоваться для смены монитора на подколлекцию?

Кто-нибудь знает другое решение?

1 Ответ

0 голосов
/ 24 февраля 2019

Может ли транзакция использоваться для смены монитора на подколлекцию?

Транзакции в Firestore выполняются с помощью так называемой операции сравнения и обмена .В транзакции вы читаете документ из базы данных, определяете его текущее состояние и затем устанавливаете его новое состояние на основе этого.Сделав это для всей транзакции, вы отправляете на сервер весь пакет документов о текущем состоянии и новом состоянии.Затем сервер проверяет, совпадает ли текущее состояние на уровне хранилища с тем, с чего начинал ваш клиент, и в этом случае он фиксирует новое указанное вами состояние.

Зная это, единственный способ контролироватьВся коллекция в транзакции заключается в считывании всех документов из этой коллекции в транзакцию.Хотя это технически возможно для небольших коллекций, это, вероятно, будет очень неэффективно, и я никогда не видел, чтобы это делалось на практике.Опять же, только для двух документов в вашей коллекции может быть вполне возможно просто прочитать их в транзакции.


Имейте в виду, что транзакция обеспечивает только согласованные данные, она не обязательноограничить возможности злоумышленникаЕсли вы хотите убедиться, что в коллекции не более двух документов, вам следует рассмотреть механизм на стороне сервера.

Простейшим механизмом (с точки зрения инфраструктуры) является использование серверных правил безопасности Firestore, но я не думаю, что они будут работать для ограничения количества документов в коллекции, как объяснил Даг в своем ответе Ограничить количество документов в подколлекции в правилах пожарного депо .

Наиболее вероятным решением в этом случае является (как предлагает и Дуг) использование облачных функций для записи документов во вложенную коллекцию.Таким образом, вы можете просто отклонить прямую запись от клиента и применить любую бизнес-логику в своем коде облачных функций, который выполняется в доверенной среде.

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