Android Kotlin中FireStore代码创建的users集合无法读取问题排查
核心原因
你遇到的问题本质是Firestore的集合与文档逻辑规则:
Firestore中,父集合不会因为子集合的存在而自动生成对应的父文档。你的注册代码是在users/{uid}这个不存在的文档下,创建了basicUserInfo子集合并添加文档,但users集合本身并没有任何实际文档——Firestore允许在不存在的文档路径下创建子集合,但这不会让users集合里出现{uid}文档。所以当你调用db.collection("users").get()时,users集合里没有可返回的文档,自然结果为空。
而你在控制台手动创建users集合的文档时,users集合里确实存在了文档,所以查询能正常返回结果。
修复方案
根据业务场景,有两种合理的修复方式:
方式1:将基础信息直接存在users/{uid}文档中(推荐)
如果basicUserInfo里的内容就是用户核心基础数据,完全不需要子集合,直接把数据存在users集合的{uid}文档里:
db.collection("users").document(mUser.uid).set(info)
这样users集合里会直接生成对应uid的文档,后续调用db.collection("users").get()就能正常读取到所有用户数据。
方式2:先创建users/{uid}文档,再添加子集合
如果业务确实需要basicUserInfo子集合(比如后续要在该子集合下存多条关联数据),那注册时先创建users/{uid}的文档(哪怕只存一个空对象或uid字段),再创建子集合:
// 先创建users下的uid文档 db.collection("users").document(mUser.uid).set(mapOf("uid" to mUser.uid)) .addOnSuccessListener { // 文档创建成功后,再添加子集合数据 db.collection("users").document(mUser.uid).collection("basicUserInfo").add(info) }
这样users集合里就有了对应的文档,查询users集合时就能返回结果。
额外说明
Firestore里的集合是惰性存在的:只有当集合中至少有一个文档时,集合才会被视为“存在”并在查询中返回。子集合的存在不会触发父集合或父文档的自动创建,这是和传统关系型数据库完全不同的逻辑,需要特别注意。
内容的提问来源于stack exchange,提问作者Hayato Koyama

