为何调用Firestore的collection().get()时,含子集合的文档返回数量为0?
解决Firestore子集合查询返回0个文档的问题
问题描述
调用Firestore查询teachers/irfany/OpenAssignments集合时,日志返回文档数量为0,但数据库中该路径下存在作为子集合容器的"文档"。
排查与解决步骤
1. 验证集合路径的准确性
Firestore的集合和文档名称区分大小写,请严格核对控制台中的路径:
- 确认
teachers集合下存在irfany文档 - 确认
irfany文档下的子集合名称确实是OpenAssignments(注意大小写、拼写是否完全一致)
2. 检查Firestore安全规则
默认安全规则会阻止未授权的读取操作,即使数据库中有数据也会返回空结果。
- 测试环境可临时修改规则允许读取(仅用于排查):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /teachers/{teacherId}/OpenAssignments/{doc} { allow read: if true; allow write: if request.auth != null; } } }
生产环境务必替换为基于用户身份验证的权限规则,避免数据泄露。
3. 确认容器文档存在实际数据
Firestore中,仅作为子集合容器的文档(无任何字段)不会被查询返回。如果OpenAssignments下的"文档"只是用来承载子集合,没有存储任何键值对,那么get()方法不会将其计入结果。
- 解决方法:给这些容器文档添加至少一个字段(例如
createdAt: FieldValue.serverTimestamp()),添加后即可被查询到。
4. 排查代码执行时机
确保查询代码在Firebase初始化完成后执行,例如在Activity的onCreate方法中,或者通过FirebaseApp.initializeApp(this)确认初始化完成后再调用查询。
5. 增强日志排查
在代码中添加更多日志,确认查询的细节:
db.collection("teachers").document("irfany").collection("OpenAssignments") .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { QuerySnapshot result = task.getResult(); Log.d("getdocumentSize", "文档数量: " + result.size()); Log.d("QueryDebug", "查询是否为空: " + result.isEmpty()); Log.d("QueryDebug", "查询路径: " + result.getQuery().getPath()); } else { Log.d("Error", "获取文档失败: ", task.getException()); } } });
内容的提问来源于stack exchange,提问作者irfan yaqub
相关产品推荐
相关产品推荐

