如何从Firestore查询的快照文档中获取文档引用列表
Firestore查询聊天文档引用列表的问题及修正方案
需求说明
- 查询
chat集合中users字段 - 筛选出
users数组同时包含chatUserRef和authUserRef两个文档引用的文档(理论上仅存在一个,需兼容多文档异常场景) - 返回匹配到的聊天文档引用列表
原代码存在的问题
- 数组匹配逻辑错误:使用
isEqualTo匹配数组时,Firestore会严格校验数组的元素顺序,如果数据库中users数组的顺序和传入的[authUserRef, chatUserRef]不一致,查询会返回空结果 - 类型不匹配:函数声明返回
List<ChatsRecord>,但代码中尝试返回DocumentReference,两者类型不兼容 - 字符串拼接错误:
'chats/$e.id'会被当作普通字符串处理,无法正确获取文档ID,应该使用字符串插值语法'chats/${e.id}',或者直接通过e.reference获取文档引用
修正后的代码
import 'package:cloud_firestore/cloud_firestore.dart'; // 假设ChatsRecord是自定义模型,需确保有从DocumentSnapshot转换的构造方法或工厂函数 class ChatsRecord { final DocumentReference reference; // 可添加其他业务字段 ChatsRecord({required this.reference}); // 工厂函数:从DocumentSnapshot生成ChatsRecord实例 factory ChatsRecord.fromSnapshot(DocumentSnapshot snapshot) { return ChatsRecord(reference: snapshot.reference); } } Future<List<ChatsRecord>> getChatDoc( DocumentReference chatUserRef, DocumentReference authUserRef, ) async { final firestore = FirebaseFirestore.instance; final collectionRef = firestore.collection('chats'); // 使用arrayContainsAll确保数组同时包含两个引用,不受元素顺序影响 final filteredQuery = collectionRef.where( 'users', arrayContainsAll: [authUserRef, chatUserRef], ); final querySnapshot = await filteredQuery.get(); // 将查询快照转换为ChatsRecord列表 return querySnapshot.docs.map((doc) => ChatsRecord.fromSnapshot(doc)).toList(); }
关键优化点
- 使用
arrayContainsAll替代isEqualTo,确保只要数组包含指定的两个引用就会匹配,不受元素顺序影响 - 正确处理
ChatsRecord类型转换,通过工厂函数从DocumentSnapshot生成实例 - 直接使用
doc.reference获取文档引用,避免字符串拼接错误
内容的提问来源于stack exchange,提问作者satchel
相关产品推荐
相关产品推荐

