你好,我在下载文档中的所有集合时遇到了问题。我希望在找到 id(userUid)文档后能够下载其所有集合,我需要每个集合的 id
export const getAllMessagesByUserId = async (userUid) => { const result = await firebase .firestore() .collection('messages') .doc(userUid) .onSnapshot((snapshot) => { console.log(snapshot); }); };
我建议您使用文章中提出的第二种方法,即使用云函数。
这是从文章中复制的代码。
云功能:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.getSubCollections = functions.https.onCall(async (data, context) => { const docPath = data.docPath; const collections = await admin.firestore().doc(docPath).listCollections(); const collectionIds = collections.map(col => col.id); return { collections: collectionIds }; });
从 Web 应用程序调用云函数的示例:
const getSubCollections = firebase .functions() .httpsCallable('getSubCollections'); getSubCollections({ docPath: 'collectionId/documentId' }) .then(function(result) { var collections = result.data.collections; console.log(collections); }) .catch(function(error) { // Getting the Error details. var code = error.code; var message = error.message; var details = error.details; // ... });
为了实现获取 Firestore 中特定文档下的所有集合并获取其 ID 的目标,您需要遵循以下步骤:
Firestore 不直接支持在一次调用中获取文档下的所有子集合。相反,您需要手动列出子集合,然后从每个子集合中检索文档。
您可以按照以下方法修改代码以实现此目的:
import firebase from 'firebase/app'; import 'firebase/firestore'; export const getAllMessagesByUserId = async (userUid) => { try { const db = firebase.firestore(); const userDocRef = db.collection('messages').doc(userUid); // Get all subcollections of the user document const subcollectionsSnapshot = await userDocRef.listCollections(); // Fetch all documents from each subcollection const result = await Promise.all(subcollectionsSnapshot.map(async (subcollectionRef) => { const subcollectionDocs = await subcollectionRef.get(); return subcollectionDocs.docs.map(doc => ({ subcollectionId: subcollectionRef.id, documentId: doc.id, data: doc.data(), })); })); console.log(result); return result; } catch (error) { console.error("Error fetching messages:", error); } };
firebase.firestore()
listCollections()
get()
Promise.all()
getAllMessagesByUserId('userUid123') .then(messages => { console.log(messages); }) .catch(error => { console.error("Error:", error); });
这种方法可确保您检索 Firestore 中给定用户文档的所有子集合及其各自的文档。