Flutter中如何查询Firestore列表嵌套Map中匹配uid的文档?
解决Firestore查询数组中对象字段的问题
你的查询返回空结果,可从以下几点排查并解决:
1. 检查Firestore安全规则
如果安全规则限制了abc集合的读取权限,即使查询条件正确也会返回空。可先临时设置宽松规则测试(后续务必改回安全规则):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /abc/{doc} { allow read, write: if true; } } }
2. 确认查询语法与数据匹配
Firestore支持直接查询数组中对象的指定字段,你的语法本身是可行的,但需确保:
- 集合名
abc、数组字段list、对象内字段uid的大小写和拼写完全匹配Firestore中的存储 - 代码中的UID与Firestore文档内的UID完全一致(无空格、大小写错误等)
若确认信息无误,可保留原有查询代码,或改用get()方法直接打印结果排查:
// 测试用get方法,输出查询详情 FirebaseFirestore.instance .collection('abc') .where('list.uid', isEqualTo: 'ijQS0rKB4aOJSoTKy1zvmy8O9me2') .get() .then((snapshot) { print("找到的文档数: ${snapshot.size}"); snapshot.docs.forEach((doc) { print(doc.data()); }); });
3. 备选方案:匹配完整数组对象(灵活性较低)
若上述方法仍不生效,可尝试用arrayContains匹配完整的数组对象,但需传入对象的所有键值对:
StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance .collection('abc') .where('list', arrayContains: { 'uid': 'ijQS0rKB4aOJSoTKy1zvmy8O9me2', 'name': '对应文档中的name值', 'avatarUrl': '对应文档中的avatarUrl值' }) .snapshots(), builder: (context, snapshot) { // 原有builder逻辑不变 if (snapshot.hasError) { return const Center(child: Text('Something wrong!')); } if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } if (snapshot.data!.size == 0) { return const Center( child: Text('No Data'), ); } return const Center(child: Text('Done')); }, )
4. 检查索引(必要时创建)
若查询涉及排序或复杂条件,可在Firestore控制台的「索引」页面创建对应的复合索引。
内容的提问来源于stack exchange,提问作者Kvu
相关产品推荐
相关产品推荐

