如何使用nodejs从firestore中的doc获取子集合列表?

3df52oht  于 2023-01-08  发布在  Node.js
关注(0)|答案(2)|浏览(139)

你好,我真的是新的firebase技术。有人能帮助我吗?我想得到的子集合列表,如果博士有子集合。

db.collection("Class 1").get().then((querySnapshot) => {
    const tempDoc = []
    querySnapshot.forEach((doc) => {
       tempDoc.push({ id: doc.id, ...doc.data() }) // some of doc have one or more sub-collections
    })
    console.log(tempDoc)
 })

如果文档有子集合,我怎样才能得到子集合的名称?下面是我想要得到的结果。

const tempDoc = [  //The Result Which I want
    {
      id: "One",
      data : "something-1",
      sub_collection : null,
    },
    {
      id: "Two",
      data : "something-2",
      sub_collection : ["sub collection - 1", "sub collection - 2"],
    },
    {
      id: "Three",
      data : "something-3",
      sub_collection : ["sub collection"],
    },
]
yk9xbfzb

yk9xbfzb1#

如文档中所述,通过Node.js的Admin SDK,您可以使用listCollections()方法列出文档引用的所有子集合。

const sfRef = db.collection('Class 1').doc('...');
const collections = await sfRef.listCollections();
collections.forEach(collection => {
  console.log('Found subcollection with id:', collection.id);
});

在您的情况下,需要按如下方式使用Promise.all()(未经测试):

const docsData = [];

db.collection("Class 1").get()
.then((querySnapshot) => {
    
    const promises = [];
    querySnapshot.forEach((doc) => {
       docsData.push({ id: doc.id, ...doc.data() });
       promises.push(doc.ref.listCollections())
    })
    return Promise.all(promises);
})
.then(subcollsArray => ({   // Arrays of Array of subcollections
    const resultsArray = [];
    subcollArray.forEach((subcollArray, idx) => {
       resultsArray.push({ ...docsData[idx], sub_collections: subcollArray})
    })

    console.log(resultsArray)

});

请注意,无法使用移动的/Web客户端库检索收藏列表,但有一些变通方法,请参阅article

bf1o4zei

bf1o4zei2#

如果你在项目的其他部分使用这个函数,把它设为异步:

/* Did you try this? */
const fetchDocs = async() => {
  const tempDoc = [];
  await db.collection("Class 1").get()
    .then((querySnapshot) => {
      querySnapshot.forEach((doc) => {
        tempDoc.push({
          id: doc.id,
          ...doc.data()
        });

      });
      console.log(tempDoc);
    });
  return tempDoc;
};

fetchDocs()
  .then((data) => {
    if (data.sub_collection) {
      // do something
    }
  })

相关问题