Firestore-Flutter中whereIn超10项时如何生成多个Query?
解决Firestore whereIn参数超过10个时生成多个Query的问题
Firestore的whereIn查询最多支持10个参数,当用户列表长度超过10时,需要拆分生成多个Query而非单个。针对你遇到的代码问题,以下是正确的实现方式:
问题分析
- 第一种代码使用
forEach遍历子列表,但forEach返回void,无法匹配函数要求的Query返回类型,且没有收集生成的Query。 - 第二种代码每次仅生成一个分段Query,无法一次性获取所有需要的查询实例。
正确实现:生成多个Query列表
修改函数返回类型为List<Query<Map<String, dynamic>>>,通过map遍历分段列表,收集每个子列表对应的Query:
List<Query<Map<String, dynamic>>> getUsersInTeamsQueries() { List<DocumentReference> usersInTeam = teamRecord.usersInTeam.asList(); List<List<DocumentReference>> subLists = []; // 将用户列表拆分为每10个一组的子列表 for (var i = 0; i < usersInTeam.length; i += 10) { final end = i + 10 > usersInTeam.length ? usersInTeam.length : i + 10; subLists.add(usersInTeam.sublist(i, end)); } // 为每个子列表生成对应的Query并收集到列表中 return subLists.map((subList) { return FirebaseFirestore.instance .collection('activity_units') .orderBy('activity_value', descending: true) .where('challenge_reference', isEqualTo: widget.challenges.reference) .where('user_inchallenge', whereIn: subList); }).toList(); }
后续处理:合并所有查询结果(可选)
如果需要获取所有Query对应的文档数据并合并,可以通过Future.wait并行执行所有查询,再合并结果:
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getAllUsersInTeamsData() async { final queries = getUsersInTeamsQueries(); // 并行获取所有Query的快照 final snapshots = await Future.wait(queries.map((q) => q.get())); // 合并所有文档到一个列表 final allDocs = <QueryDocumentSnapshot<Map<String, dynamic>>>[]; for (final snapshot in snapshots) { allDocs.addAll(snapshot.docs); } // 全局排序(因为每个Query是单独排序的,合并后需重新排序) allDocs.sort((a, b) => b.data()['activity_value'].compareTo(a.data()['activity_value'])); return allDocs; }
内容的提问来源于stack exchange,提问作者Dennis Ashford
相关产品推荐
相关产品推荐

