我如何使用 .where 进行交易

How can i make transection using .where

因为交易只接受 DocumentReference 所以我无法处理 .where()。

 DocumentReference test1=  FirebaseFirestore.instance.collection("users").doc(currentUser.uid);

Query<Map<String, dynamic>> test2=   FirebaseFirestore.instance.collection("users").where('test',isEqualTo: 'mytest').limit(1);

    return FirebaseFirestore.instance.runTransaction((transaction) async {

      //no problem with this DocumentSnapshot 
      DocumentSnapshot _value = await transaction.get(test1);
     

      //BUT
      //here in test2 will never accept Query<Map<String, dynamic>>
      //since the transaction is only accept DocumentReference 
      DocumentSnapshot _value2 = await transaction.get(test2);

      if (_value.exists) {
     //action
      }

    })

如何获取交易中的.where引用?

Cloud Firestore 不提供可以在通过查询获得的文档上使用事务的解决方案。另请注意,事务对象不能执行查询。您拥有的唯一选择是在单个文档上使用事务处理。

根据您最后的评论,由于您使用的是 .limit(1),这意味着您需要更新单个文档,在这种情况下,您可以创建一个精确指向该文档的引用并执行交易:

DocumentReference uidRef =  FirebaseFirestore.instance.collection("users").doc(currentUser.uid);
uidRef.runTransaction(/* ... /*);

如果您不知道需要对其执行事务的用户的 UID,那么您应该在事务外执行必要的查询,获取文档的 ID,然后立即执行事务.但是如您所见,您无法一次完成这两个操作。

另请记住,只有当您需要从文档中读取一些数据以便在更新文档之前做出决定时,才可以使用事务。我不是 100% 确定,但在您的特定情况下,我认为您不会那样做。您没有以决定如何处理它的方式使用 _value 的值。如果这是您的情况,批量写入肯定可以完成工作。