如何在Cloud Firestore中两次过滤数据并判断用户文档int类型Level字段是否存在
问题核心原因
你现有代码存在3个关键错误:
'Stufe' is int是Dart本地的类型判断语句,返回值为布尔值,无法作为Firestore的查询条件传给后端- 没有将
get()请求返回的QuerySnapshot实例赋值给变量,直接用QuerySnapshot类名访问实例属性,所以触发datagetter不存在的报错 QuerySnapshot本身就没有data属性,查询到的文档列表直接存储在docs属性中- 原有思路效率极低:不需要拉取全量符合条件的文档再过滤,直接查询当前用户的单篇文档即可,大幅节省读请求配额和带宽
最优实现方案
直接查询当前用户对应的文档,本地判断Stufe字段类型即可:
class StufenService{ String userID; StufenService(this.userID); final CollectionReference userTodos = FirebaseFirestore.instance.collection('userTodos'); Future<bool> checkIfStufeExists() async { // 直接拉取当前用户的单篇文档 final docSnapshot = await userTodos.doc(userID).get(); if (docSnapshot.exists) { final docData = docSnapshot.data() as Map<String, dynamic>?; // 直接判断Stufe字段是否为int类型 return docData?['Stufe'] is int; } // 文档不存在直接返回false return false; } }
原有思路修正版(不推荐)
如果你确实需要按照先查全量符合条件文档、再匹配当前用户的逻辑实现,修正后代码如下:
Future<bool> checkIfStufeExistsOldWay() async { final querySnapshot = await userTodos.where('Stufe', isNull: false).get(); // 遍历所有查询结果匹配用户ID和字段类型 return querySnapshot.docs.any( (doc) => doc.id == userID && (doc.data() as Map<String, dynamic>)['Stufe'] is int ); }
该方案在集合数据量较大时会产生大量不必要的读请求,仅做参考不建议线上使用。
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

