Angular项目中Firestore无字段主文档无法获取的解决方法问询
在Angular中获取Firestore含子集合的空主文档解决方案
问题场景
主集合my-maincollection下共有290个关联了子集合my-subcollection的文档ID,但仅30个主文档带有字段。调用collection.get()时只返回这30个文档,其余仅含子集合的空文档被忽略,无法访问它们的子集合。
原代码:
const collectionRef = firebase.firestore().collection('my-maincollection'); const querySnapshot = await collectionRef.get(); console.log(querySnapshot.docs.length) // 仅返回30,预期290
原因说明
Firestore中,仅关联了子集合但未被显式创建(或没有任何字段)的文档,不会被视为“存在”的文档。get()方法只会返回存在的文档,因此那些只有子集合的空文档会被过滤掉。
解决方法
方法1:使用listDocuments()获取所有文档引用
listDocuments()方法会返回集合下所有文档的引用,无论文档本身是否有字段、是否被显式创建,完美适配你的场景:
const collectionRef = firebase.firestore().collection('my-maincollection'); // 获取所有文档引用 const docRefs = await collectionRef.listDocuments(); console.log(docRefs.length); // 会返回290 // 遍历访问每个文档的子集合 for (const docRef of docRefs) { const subCollectionRef = docRef.collection('my-subcollection'); const subSnapshot = await subCollectionRef.get(); // 处理子集合数据 console.log(`子集合文档数:${subSnapshot.docs.length}`); }
方法2:给空文档添加占位字段(适合批量更新或后续新增)
如果需要通过get()直接获取所有文档,可以给那些仅含子集合的空文档添加一个无意义的占位字段(比如_exists: true),这样Firestore会将其视为存在的文档:
// 批量更新示例(需遍历所有文档引用后设置) const docRefs = await collectionRef.listDocuments(); for (const docRef of docRefs) { const docSnap = await docRef.get(); if (!docSnap.exists) { await docRef.set({ _exists: true }, { merge: true }); } } // 之后再调用get()就能返回所有290个文档 const querySnapshot = await collectionRef.get(); console.log(querySnapshot.docs.length); // 290
内容的提问来源于stack exchange,提问作者akhilkrishnan1268
相关产品推荐
相关产品推荐

