React JS中Firebase v9 Firestore按ID创建文档及获取文档ID并创建子集合的技术问题
解答:React中Firebase v9 Firestore的两个常见问题
1. 按指定ID创建文档
Firebase v9里,addDoc()是自动生成随机文档ID的,要是你想自定义指定ID,得换个思路:先用doc()方法指定好包含目标ID的完整文档路径,再用setDoc()来创建(或更新)文档。
举个实际例子,假设要在users/{uid}/proyects下创建一个ID为my-custom-proyect的文档:
import { doc, setDoc } from "firebase/firestore"; // 定义你想要的自定义文档ID const customDocId = "my-custom-proyect"; // 创建指定ID的文档(如果已存在会覆盖,加{ merge: true }可合并字段) await setDoc(doc(db, 'users', currentUser.uid, 'proyects', customDocId), { name: "我的自定义项目", userUid: currentUser.uid });
2. 获取proyects集合所有文档ID并创建tasks子集合
你之前用doc().id无效的原因很简单:这个方法会生成一个全新的随机ID,根本不是你已存在的proyect文档的ID。正确的流程应该是先把proyects集合里的所有文档查出来,再挨个遍历拿到每个文档的真实ID,最后在对应路径下创建tasks子集合的文档。
完整的实现代码如下:
import { collection, getDocs, addDoc } from "firebase/firestore"; // 第一步:先获取proyects集合的所有文档快照 const proyectsRef = collection(db, 'users', currentUser.uid, 'proyects'); const proyectsSnapshot = await getDocs(proyectsRef); // 第二步:遍历每个文档,为其创建tasks子集合文档 proyectsSnapshot.forEach(async (proyectDoc) => { // 拿到当前proyect文档的真实ID const proyectId = proyectDoc.id; // 在该proyect下的tasks子集合中添加新任务 await addDoc(collection(db, 'users', currentUser.uid, 'proyects', proyectId, 'tasks'), { name: tarea, userUid: currentUser.uid }); });
要是你需要确保所有任务都创建完成后再执行后续逻辑,可以用Promise.all()来批量处理异步操作:
// 把所有创建任务的Promise收集起来 const createTasksPromises = proyectsSnapshot.docs.map(async (proyectDoc) => { const proyectId = proyectDoc.id; return addDoc(collection(db, 'users', currentUser.uid, 'proyects', proyectId, 'tasks'), { name: tarea, userUid: currentUser.uid }); }); // 等待所有任务创建完成 await Promise.all(createTasksPromises);
这样就能准确遍历所有已存在的proyect文档,并为每个文档创建对应的tasks子集合文档了。
内容的提问来源于stack exchange,提问作者iandev
相关产品推荐
相关产品推荐

