Flutter中Firestore如何实现多字段OR条件查询聊天室记录
问题说明
开发聊天系统时,chat-rooms集合存储每个聊天室关联的两个用户ID,分别对应字段user_1(发送方)、user_2(接收方),需要查询当前登录用户ID匹配user_1 或 user_2的所有聊天室记录。
原有查询代码仅支持单字段匹配,无法实现OR逻辑同时匹配两个用户字段,无法满足业务需求,原有代码如下:
final docRef = db.collection("chat-rooms").where('user_1',isEqualTo: Account.current.uid);
实现方案
优先使用Firestore原生OR查询语法,性能更好、不需要额外做本地数据处理:
- 先将项目中的
cloud_firestore依赖升级到最新稳定版本 - 使用
Filter对象构建OR查询条件,代码如下:
import 'package:cloud_firestore/cloud_firestore.dart'; final currentUid = Account.current.uid; final chatRoomQuery = FirebaseFirestore.instance .collection('chat-rooms') .where( Filter.or( Filter('user_1', isEqualTo: currentUid), Filter('user_2', isEqualTo: currentUid), ) );
补充说明
- 上述等值OR查询不需要手动创建复合索引,Firestore原生支持该类查询
- 如果受项目依赖版本限制,无法使用
Filter语法,可以通过两次单条件查询后本地合并去重实现相同效果,该方案性能弱于原生OR查询,仅做兼容使用,示例代码:
final currentUid = Account.current.uid; // 分别查询两个字段匹配的结果 final res1 = db.collection("chat-rooms").where('user_1', isEqualTo: currentUid).get(); final res2 = db.collection("chat-rooms").where('user_2', isEqualTo: currentUid).get(); // 合并结果并去重 final queryResults = await Future.wait([res1, res2]); final matchedChatRooms = [...queryResults[0].docs, ...queryResults[1].docs].toSet().toList();
内容的提问来源于stack exchange,提问作者نعمان منذر محمود الجميلي
相关产品推荐
相关产品推荐

