Документ обновления Firestore без пропуска значений во Flutter

В настоящее время у меня есть коллекция со списком пользователей в ней

В моем приложении администратора у меня есть кнопка, которая позволяет мне обновлять документы пользователей на основе текущего значения, которое я установил, что делается с помощью этой функции:

onPressed: () async {
  var querySnapshots = await collection
      .where('current_pick', isEqualTo: _currentValue)
      .get();
  for (var doc in querySnapshots.docs) {
    await doc.reference.update({
      'current_streak': FieldValue.increment(1),
      'current_score': FieldValue.increment(1),
      'rank_up': true,
    });
  }
},

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

Я заметил, что очень редко он пропускает обновление одного из трех значений для некоторых пользователей, и мне было интересно, существует ли другой подход к обновлению значений без сбоев?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы захотите использовать пакетная запись, который позволяет вам атомарно записывать в несколько документов.

Для вашего кода это будет выглядеть примерно так:

// Get a new write batch
final batch = db.batch();

// Put the updates into the batch
for (var doc in querySnapshots.docs) {
  batch.update(doc.reference, {
    'current_streak': FieldValue.increment(1),
    'current_score': FieldValue.increment(1),
    'rank_up': true,
  });
}

// Commit the batch
batch.commit().then((_) {

Обратите внимание, что пакетная запись может содержать до 500 операций, поэтому, если у вас может быть более 500 документов для обновления, вам придется разделить их на несколько пакетных операций записи.

Спасибо за ваш ответ, Фрэнк, кажется, это именно то, что я ищу! Как будет писать одна разделенная партия?

FlutterChicken 17.05.2022 15:49

Держите счетчик, обновляйте каждую итерацию цикла, как только он достигает предела, фиксируйте пакет и запускайте новый. См. также google.com/…

Frank van Puffelen 17.05.2022 16:22

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