我正试图从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);
})