【问题标题】:How to monitor entire subcollection using transaction?如何使用事务监控整个子集合?
【发布时间】:2019-07-18 21:13:55
【问题描述】:

关注answer 我正在尝试使用事务来监控整个 Firestore 子集合以添加新文档。基本上,如果只有一个文档,我只想将新文档写入子集合。我需要使用事务来避免竞争条件导致子集合中 >2 个文档。最大值应为 2。

如何使用事务来监控添加到子集合的文档?

我尝试了很长时间但无法解决。

我正在实验使用迭代文档的子集合,但不知道如何通过事务来做到这一点。

到目前为止我的代码(可能是错误的方法):

                Firestore.instance.runTransaction((transaction) async {


                  final CollectionReference collectionRef = ref
                      .document(‘document’).collection(‘subCollection’);



                 List<DocumentSnapshot> subCollectionDocsSnapshot = [];
                  await collectionRef.getDocuments().then((querySnapshot) =>
                      querySnapshot.documents.forEach((document) {
                        subCollectionDocsSnapshot.add(document);
                      }
                      ));


                  final DocumentReference newDocRef = collectionRef.document(docName);

                  await transaction.set(
                      newDocRef,
                      {‘docName’: docName,
                      }
                  );

                });

如何解决?

谢谢!

更新:

我也尝试添加 transaction.get() 以遍历子集合文档,但它对竞争条件没有影响:

                  subCollectionDocsSnapshot.forEach((document) {
                    transaction.get(document.reference);
                  });

【问题讨论】:

    标签: firebase dart transactions flutter google-cloud-firestore


    【解决方案1】:

    Firestore 事务不支持此功能。在事务中,您只能通过 ID 查找文档。您不能对集合的全部内容进行事务处理,并且如果在事务处理过程中添加了新文档,则让该事务重试。您也无法根据查询结果进行交易。

    相反,请考虑在另一个集合中使用不同的文档来计算集合中文档的数量,然后在您的事务中使用它。或者,至少,一个文档记录了一个布尔值,指示集合是否有 >2 个文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 2011-07-30
      • 2020-04-17
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2013-10-15
      相关资源
      最近更新 更多