Firebase Flutter数组查询报错:无法多次使用array-contains过滤器
解决Firestore多arrayContains过滤报错的问题
Firestore确实不支持对同一个字段使用多个array-contains过滤器,这是它的查询规则限制。针对你的需求,有两种实用的解决方案:
方案一:修改数据结构(推荐)
将members字段从数组改为键值对映射,把每个用户ID作为键,值设为true。比如文档中的members结构变成:
"members": { "90TDhef6G9QY7ljJyZjdpeaLNoA3": true, "yutgffvvpobjjJyZjdpeaLNoA3": true }
之后就可以用多个whereEqualTo来查询同时包含两个用户的聊天记录:
FirebaseFirestore.instance .collection("Chats") .where("members.90TDhef6G9QY7ljJyZjdpeaLNoA3", isEqualTo: true) .where("members.yutgffvvpobjjJyZjdpeaLNoA3", isEqualTo: true) .get();
这种方法能直接在服务端完成过滤,效率最高,也符合Firestore的最佳实践。
方案二:客户端二次过滤(适合小规模数据)
如果暂时不想修改数据结构,可以先用单个arrayContains查询出包含其中一个用户的所有聊天记录,再在客户端过滤出同时包含另一个用户的文档:
final querySnapshot = await FirebaseFirestore.instance .collection("Chats") .where("members", arrayContains: "90TDhef6G9QY7ljJyZjdpeaLNoA3") .get(); final targetChats = querySnapshot.docs.where((doc) { final members = doc.data()["members"] as List; return members.contains("yutgffvvpobjjJyZjdpeaLNoA3"); }).toList();
注意这种方法会先加载所有包含第一个用户的文档,数据量大时会增加带宽消耗和客户端计算量,只适合聊天记录数量不多的场景。
内容的提问来源于stack exchange,提问作者Khaled Mithkal
相关产品推荐
相关产品推荐

