使用 dart 和 Firestore 在单个事务中更新多个文档

Mic*_*ael 5 firebase flutter google-cloud-firestore

我正在尝试使用 Flutter/Dart 和 Firestore创建一个保存事务,它执行以下操作:

  1. 将属性为“position: 1”的新项目添加到文档集合中
  2. 将此集合中所有其他文档的“位置”属性增加一个位置 > 1 by 1 (++)

单个文档如下所示:

{
    "title": "Some title",
    "position": 1
}
Run Code Online (Sandbox Code Playgroud)

在文档(https://firebase.google.com/docs/firestore/manage-data/transactions)中,我找到了有关如何在单个文档上进行保存交易的说明,但没有找到有关如何创建此“两步- atomic-transaction”,我需要在集合中保存插入和更新。

也许有人对我有暗示?

更新: 感谢您的输入弗兰克。这是一个代码片段,希望能解释我想要实现的目标:

@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());

});
Run Code Online (Sandbox Code Playgroud)

}

Fra*_*len 2

事务不能包含查询。因此,您需要首先运行查询来查找匹配的文档,然后获取并更新事务中的每个文档。除此之外,它应该相当简单。

  1. 运行查询以确定所有受影响的文档
  2. 开始交易
  3. 创建新文档
  4. 循环遍历受影响的文档并对每个文档进行:

    1. 从交易中读取文档
    2. 更新文档数据
    3. 通过事务写回文档

尝试一下,如果您遇到困难,请发回重现您遇到困难的代码