Firestore写入带嵌套子集合的文档后无法查询对应数据问题咨询
问题产生原因
这是Firestore的固有特性导致的:当你仅在某文档的子集合中写入数据、从未主动给该父文档写入任何字段时,Firestore不会自动创建该父文档的实体,父文档只会作为子集合的路径占位符(也被称为「幽灵文档」)存在,不会被上层集合的查询返回,直接按ID查询也会判定为不存在。
你第一种写入逻辑只在title文档的子集合subTitle中添加了数据,没有为title文档本身写入任何内容,因此该文档属于虚拟的占位节点,自然查询userId集合时拿不到对应数据。而你直接对title文档调用setData的写法会真实创建父文档,所以可以正常查询到。
对应解决办法
- 方案1:创建子集合前先写入父文档
如果需要上层集合能查询到该父文档,在写入子集合数据前先给父文档写入至少一个字段(可以是占位字段),示例代码如下:
// 先写入父文档,保证实体存在 db.collection(userId).document(title).setData([ "createTime": Date(), // 可根据业务需要添加其他字段,无业务字段也可加占位标识 "hasSubCollection": true ]) { error in guard error == nil else { print("父文档创建失败:\(error!)") return } // 父文档创建完成后再写入子集合数据 db.collection(userId).document(title).collection(subTitle).addDocument(data: [ "key": "value" ]) }
- 方案2:直接查询目标子集合
如果不需要获取父文档数据,仅需要读取子集合的内容,直接指向对应子集合路径查询即可,不需要先查询上层父集合:
// 直接查询指定子集合的内容 db.collection(userId).document(title).collection(subTitle).getDocuments() { snapshot, error in // 处理子集合查询结果 }
- 方案3:需要批量获取所有带虚拟父文档的路径
如果确实需要获取某集合下所有有子集合的虚拟父文档路径,客户端SDK无法实现该需求,只能通过Firebase Admin SDK在服务端遍历集合下的所有子集合路径,再将结果返回给客户端。
内容的提问来源于stack exchange,提问作者Kevvv
相关产品推荐
相关产品推荐

