firebase - 如何使用事务监控整个子集合?

标签 firebase dart transactions flutter google-cloud-firestore

关注这个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);
                  });

最佳答案

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

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

关于firebase - 如何使用事务监控整个子集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54866672/

相关文章:

javascript - 如何检查从 Firebase 数据库获取的特定字符串以过滤接收到的数据?

dart - 如何检查 dart 中的类型错误

flutter - 如何在容器内的文本左侧添加图标

hibernate - Grails交易问题

java - Spring:用于只读事务的单独数据源

transactions - EMV 在线非接触式卡支付中的 ARQC 和 ARPC。它是如何工作的?

javascript - 如何处理多次更新的Firebase数据库安全规则?

firebase - angularfire2会将时间戳值转换为js Date吗?

json - Flutter HTTP获取JSON数据

javascript - React/Firebase 错误 : Cannot read property 'database' of undefined