如何从firebasefirestore异步获取所有父集合的所有文档



我正试图从firestore数据库中获取所有集合中的所有文档,该数据库看起来像这样:

-users(collection)
-user1 (document)
-snippets(collection)
-snippetdId1 (document)
-snippetdId2 (document) 
-user2 (document)
-snippets (collection)
-snippetdId1 (document)
-snippetdId2 (document)
-snippetdId3 (document)
let allSnippets = [];
firebase
.firestore()
.collection("users")
.get()
.then((snapshot) => {
snapshot.docs.forEach(async (element) => {
const snippets = await firebase
.firestore()
.collection("users")
.doc(element.id)
.collection("snippets")
.get();
snippets.forEach(
async (snippet) => await allSnippets.push(snippet.data())
);
});
console.log(allSnippets); // [](length 0, but has all the elements inside)
});

我遇到的问题是"allSnippets"数组的长度为0,但它包含了我想要的所有元素,我知道问题是同步性,但我不知道如何解决它。我试过使用.then,但它是一样的,长度为0,但里面有所有元素。

问题是console.log(allSnippets)在任何allSnippets.push(snippet.data()运行之前运行。如果您添加更多的日志记录,或者在调试器中运行代码,您可以很容易地看到这一点。

通常,您会使用Promise.all来等待,直到对代码段的所有get()调用都完成。但实际上有一种更简单的方法。由于您希望从所有用户获取所有代码段,因此可以使用集合组查询。这样,整个代码就简化为:

firebase.firestore()
.collectionGroup("snippets")
.get()
.then((snippetsSnapshot) => {
const snippets = snippetsSnapshot.docs.map(doc => doc.data());
console.log(snippets);
})

最新更新