Flutter 中 Firestore 查询子集合与父集合结果为何不同?
数据小许
结论
两段代码指向的 Firestore 路径不同。第一段查询 users/{userId}/profiles/default/incomeRecords 下的文档,第二段引用的是 users/{userId}/profiles 集合。子集合中的记录不会自动成为父集合的文档,所以查询 profiles 不会返回 incomeRecords 中的记录。
第二段代码末尾没有 .get(),按原样只会得到一个 CollectionReference,不会执行读取。如果实际代码还调用了 .get(),请检查 profiles 集合下是否存在文档。
按读取目标选择路径
读取 profiles 集合下的文档:
final QuerySnapshot profilesSnap = await _firestore
.collection('users')
.doc(userId)
.collection('profiles')
.get();
读取 default 文档下的 incomeRecords 子集合:
final QuerySnapshot incomeRecordsSnap = await _firestore
.collection('users')
.doc(userId)
.collection('profiles')
.doc('default')
.collection('incomeRecords')
.get();
如果要读取 default 这个 profile 文档本身,应直接读取该文档:
final DocumentSnapshot profileSnap = await _firestore
.collection('users')
.doc(userId)
.collection('profiles')
.doc('default')
.get();
为什么父集合可能为空
Firestore 的集合查询只返回指定集合路径下的文档。读取 profiles/default 下的 incomeRecords 子集合,不会同时创建或返回 profiles 中的 profile 文档;查询 profiles 也不会递归读取子集合。
因此,即使 users/{userId}/profiles/default/incomeRecords 中有记录,只要 users/{userId}/profiles 下没有实际文档,查询 profiles 仍可能返回空结果。可以在 Firebase Console 中核对这两条完整路径,并确认 profiles 下是否存在 default 文档。
检查要点
- 确认读取的是预期路径:
users/{userId}/profiles、users/{userId}/profiles/default,或users/{userId}/profiles/default/incomeRecords。 - 查询集合时调用
.get(),并检查返回的QuerySnapshot.docs;读取单个文档时,在文档引用上调用.get()。 - 确认
userId与 Firestore 中的实际路径一致。 - 题目片段没有提供实际的快照处理代码或数据库结构,无法据此判断空结果的具体原因。请先核对路径及对应层级下是否有文档。
备注:内容仅供参考。
