Flutter Firebase如何实现collectionGroup多字段OR条件查询?
方案1:使用Firestore官方提供的
Filter.or组合条件(适用于cloud_firestore 3.10.0及以上版本) 这是目前官方原生支持的OR查询实现,直接把多个条件用Filter.or包裹传入where方法即可,代码示例:
import 'package:cloud_firestore/cloud_firestore.dart'; final searchKeyword = "你要搜索的关键词"; Query query = FirebaseFirestore.instance .collectionGroup("Posts") .where( Filter.or( Filter("name", isEqualTo: searchKeyword), Filter("writer", isEqualTo: searchKeyword), ), ); // 后续执行查询获取结果示例: QuerySnapshot snapshot = await query.get(); for (var doc in snapshot.docs) { // 处理单个帖子文档数据 Map<String, dynamic> postData = doc.data() as Map<String, dynamic>; }
注意:使用该方式需要提前在Firestore控制台为这个集合组查询创建对应的复合索引,运行查询时如果报错,控制台会输出创建索引的引导信息,按指引创建索引等待生效后即可正常使用。
方案2:分别执行两个查询后合并结果(兼容旧版本SDK)
如果你的cloud_firestore版本低于3.10.0,不支持Filter.or语法,可以分别执行两个条件的查询,再对结果做去重合并:
final searchKeyword = "你要搜索的关键词"; // 分别创建两个查询 Query nameQuery = FirebaseFirestore.instance .collectionGroup("Posts") .where("name", isEqualTo: searchKeyword); Query writerQuery = FirebaseFirestore.instance .collectionGroup("Posts") .where("writer", isEqualTo: searchKeyword); // 同时执行两个查询 Future.wait([nameQuery.get(), writerQuery.get()]).then((results) { // 合并结果并去重,避免同一个帖子同时满足两个条件时重复展示 Set<String> docIds = {}; List<QueryDocumentSnapshot> allPosts = []; for (var snapshot in results) { for (var doc in snapshot.docs) { if (!docIds.contains(doc.id)) { docIds.add(doc.id); allPosts.add(doc); } } } // 后续处理allPosts列表即可 });
注意:该方式不需要额外创建复合索引,但会产生两次查询请求,适合数据量不大的场景使用。
内容的提问来源于stack exchange,提问作者Rkdio
相关产品推荐
相关产品推荐

