小能豆

如何列出 Firestore 文档的所有子集合?

javascript

cGm5x.png
mEVPG.png

你好,我在下载文档中的所有集合时遇到了问题。我希望在找到 id(userUid)文档后能够下载其所有集合,我需要每个集合的 id

export const getAllMessagesByUserId = async (userUid) => {
  const result = await firebase
    .firestore()
    .collection('messages')
    .doc(userUid)
    .onSnapshot((snapshot) => {
      console.log(snapshot);
    });

};

阅读 54

收藏
2024-06-16

共2个答案

小能豆

我建议您使用文章中提出的第二种方法,即使用云函数。

这是从文章中复制的代码。

云功能:

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;
      // ...
    });
2024-06-16
小能豆

为了实现获取 Firestore 中特定文档下的所有集合并获取其 ID 的目标,您需要遵循以下步骤:

  1. 通过用户ID获取文档参考。
  2. 列出文档下的所有子集合。
  3. 获取每个子集合并获取其文档。

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);
  }
};

解释:

  1. 获取 Firestore 参考:
  2. 使用 初始化 Firestore firebase.firestore()
  3. 列出子集合:
  4. listCollections()在文档引用上使用方法来获取子集合引用的列表。
  5. 从每个子集合中获取文档:
  6. 对于每个子集合,使用 获取所有文档get()
  7. 将结果映射到包含子集合ID、文档ID和文档数据的数组。

注意事项:

  • listCollections()方法用于列出特定文档下的所有子集合。
  • get()方法用于获取每个子集合内的文档。
  • Promise.all()用于处理同时从多个子集合中异步获取文档。
  • 结果是一个数组,其中每个元素包含子集合 ID、文档 ID 和每个文档的数据。

用法示例:

getAllMessagesByUserId('userUid123')
  .then(messages => {
    console.log(messages);
  })
  .catch(error => {
    console.error("Error:", error);
  });

这种方法可确保您检索 Firestore 中给定用户文档的所有子集合及其各自的文档。

2024-06-16