Обновите несколько документов в одной транзакции с помощью dart и Firestore - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь создать транзакцию сохранения с Flutter / Dart и Firestore, которая выполняет следующие действия:

  1. Добавить новый элемент с атрибутом «позиция: 1» в коллекцию документов
  2. Увеличить атрибуты "position" всех других документов в этой коллекции с позицией> 1 на 1 (++)

Один документ выглядит так:

{
    "title": "Some title",
    "position": 1
}

В документации (https://firebase.google.com/docs/firestore/manage-data/transactions) я нашел объяснение о том, как сделать транзакцию сохранения в одном документе, но не о том, как создать эту «двухэтапную атомарную транзакцию», в которой мне нужно сохранить вставку и обновление в коллекции.

Может быть, у кого-нибудь есть подсказка для меня?

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

@override
Future addCatalogItem(CatalogItem catalogItem) {

 return firestore.runTransaction((Transaction transaction) async {

  // Update position (++) of existing catalogItems
  await firestore
      .collection(path)
      .where("catalogId", isEqualTo: catalogItem.catalogId)
      .snapshots()
      .forEach((snapshot) {
    snapshot.documents.forEach((document) {
      // document.reference.updateData({"position": document.data["position"]});
      transaction.update(document.reference, {"position": document.data["position"] + 1});
    });
  });

  // Add the new catalogItem at position 1
  await firestore
      .collection(path)
      .document(catalogItem.id)
      .setData(catalogItem.toJson());

});

}

1 Ответ

0 голосов
/ 15 января 2019

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

  1. Запустите запрос, чтобы определить все затронутые документы
  2. Начать транзакцию
  3. Создать новый документ
  4. Цикл по затронутым документам и для каждого:

    1. Считать документ из транзакции
    2. Обновить данные документа
    3. Запишите документ обратно через транзакцию

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

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