如何在Firebase子集合中写入文档?现有代码仅支持主集合
问题分析
你当前的代码问题在于路径结构不符合Firebase的规则,且错误使用了固定字符串作为文档ID。Firebase的存储路径必须遵循集合-文档-集合-文档的交替层级,不能直接在集合下嵌套集合。你期望的jobs/email/randomid/[字段]结构,正确的层级逻辑应该是:
- 根集合:
jobs - 父文档:ID为你的
logUser.email - 子集合:可自定义名称(比如
postedJobs) - 子集合内文档:自动生成的随机ID,包含
title、prof等字段
正确代码实现
方式1:用addDoc自动生成随机ID(推荐)
addDoc会自动为子集合内的文档生成随机ID,无需手动指定:
// 获取jobs集合下email文档对应的子集合(名称可自定义) const subCollectionRef = collection(db, "jobs", logUser.email, "postedJobs"); // 向子集合添加文档 addDoc(subCollectionRef, { title: enteredTitle, prof: enteredProf, pay: enteredPay, desc: enteredDesc, });
方式2:用doc()生成随机ID后写入
如果需要提前获取随机文档ID,可以用doc()不指定ID来生成:
// 生成子集合中的随机ID文档引用 const docRef = doc(db, "jobs", logUser.email, "postedJobs", doc().id); // 写入文档数据 setDoc(docRef, { title: enteredTitle, prof: enteredProf, pay: enteredPay, desc: enteredDesc, });
注意事项
- 确保Firebase安全规则允许写入该子集合,比如需授权用户访问
jobs/{email}/postedJobs/{docId}路径 - 若不需要中间子集合名称,想把
randomid作为email文档的嵌套子文档,可直接将数据嵌套在email文档中,但这种方式不适合存储大量子数据,查询效率较低
内容的提问来源于stack exchange,提问作者polluxik
相关产品推荐
相关产品推荐

