如何使用事务监视整个子集合?

时间:2019-02-25 12:52:59

标签: 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);
                  });

1 个答案:

答案 0 :(得分:1)

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

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