GCP Node16操作Firestore子集合更新时遇NOT_FOUND错误
Firestore子集合更新报错NOT_FOUND的解决办法
错误原因
你更新文档时使用了db.collection("mysubcollection").doc(subCollect.id),这个引用指向的是根集合下的mysubcollection文档,但你的数据实际存储在父文档的子集合中(collectionGroup查询的正是这类跨父文档的子集合),因此Firestore找不到目标文档,抛出NOT_FOUND错误。
修正方案
直接使用查询返回的原始文档引用(doc.ref)进行更新,不要重新构造根集合的文档路径,同时简化代码避免不必要的重复请求:
修正后的代码
const tasks = []; // 执行子集合组查询,筛选目标文档 const querySnapshot = await db.collectionGroup("mysubcollection") .where('name', '==', "subname") .where('sequence', '==', 2).get(); // 收集需要处理的文档和父文档查询Promise querySnapshot.forEach(doc => { const data = doc.data(); if (data.enable) { // 获取父文档的引用(子集合的父级即为父文档) const parentRef = doc.ref.parent.parent; tasks.push({ subDoc: doc, // 直接保存子文档快照,无需重复调用get parentPromise: parentRef.get() }); } }); // 批量处理更新与邮件发送 for (const task of tasks) { const parentSnap = await task.parentPromise; const parentData = parentSnap.data(); // 使用原始文档引用更新,路径完全匹配子集合中的目标文档 await task.subDoc.ref.update({ sequence: 3, datetime: new Date() }); await sendMail(parentData.mail); }
关键优化细节
- 移除冗余的
subCollecPromises:查询返回的doc已经是完整的文档快照,无需再次调用doc.ref.get() - 使用
task.subDoc.ref更新:该引用包含完整的层级路径(如父集合/父文档ID/mysubcollection/子文档ID),能精准定位到子集合内的目标文档 - 用数组关联子文档与父文档请求:确保两者的对应关系不会出错,避免索引遍历可能导致的匹配问题
内容的提问来源于stack exchange,提问作者vctlzac
相关产品推荐
相关产品推荐

