Firestore添加集合文档后如何在对应文档下创建子集合
逻辑说明
你搞不懂的点本质是搞错了Firestore SDK里document()方法的运行规则:
- 当你调用不带参数的
document()方法时,SDK根本不需要发请求给Firestore后端,会直接在本地生成一个全局唯一的合法文档ID,返回的文档引用对象从创建那一刻起,就绑定了完整、固定的文档路径,不存在什么「ID还没生成」的情况。你甚至可以在刚拿到document_reference的时候就打印它的id属性,会发现哪怕还没写任何数据,ID已经是确定值了。 - Firestore本身没有「父文档必须存在才能建子集合」的限制:就算你不写父文档的内容,直接拿着这个引用往下面的子集合写数据,操作也能成功,只是对应的父文档位置是空的而已。
你的代码跑起来的完整流程是:
- 逐行遍历锦标赛列表,先把每个锦标赛里内嵌的
participants选手列表存到临时变量里,再把这个字段从原锦标赛字典里删掉,避免把整个选手列表当成父文档的字段存进去 - 调用
document()生成本地唯一ID,拿到绑定了固定路径的锦标赛文档引用 - 调用
set()把锦标赛的基础信息写到这个固定路径的父文档里 - 循环遍历拆分出来的选手列表,用同一个父文档引用定位到其下的
participants子集合,把每个选手作为独立文档加进去——因为父文档路径从一开始就是确定的,所以这些选手文档自然会挂到正确的锦标赛下面,不会串数据。
你写的实现代码:
for tournament in tournaments: participants = tournament['participants'] del tournament['participants'] document_reference = db.collection('tournaments').document() document_reference.set(tournament) for player in participants: document_reference.collection('participants').add(player)
补充:如果要避免出现「父文档写成功了,但子集合选手写到一半报错导致数据不全」的问题,可以把这些写入操作放到批量写入(Batched Write)里执行,能保证同一批操作要么全成要么全失败,不会出现脏数据。
内容的提问来源于stack exchange,提问作者Andrey Mramorov
相关产品推荐
相关产品推荐

