Я пытаюсь создать транзакцию сохранения с Flutter / Dart и Firestore, которая выполняет следующие действия:
- Добавить новый элемент с атрибутом «позиция: 1» в коллекцию документов
- Увеличить атрибуты "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());
});
}