我想从 cloud firestore
获取 50 个用户,我有两种方法都可以。
但实际上我不知道哪一个是高性能的,因为我们国家的互联网连接很差,如果我们的重点只是获取而不是迭代
。
第一种方式(单个请求)
let tempList = []; const matchingUsers = [user1, user2, user3, ..., user50]; const snap = await db.collection('users').get(); if (snap.size > 0) { sanp.docs.forEach(doc => { const data = doc.data(); matchingUsers.forEach(user => { if (data.user === user) { tempList.push(data.user); } }); }); }
第二种方式(多个请求)
matchingUsers.forEach(async user => { const snap = await db.collection('users').doc(user).get(); tempList.push(snap.data().user) });
最佳答案
使用第一种方法,您实际上是在获取整个用户集合,并将所有相应数据从后端 (Firestore) 传输到前端。这确实效率不高,特别是如果你想从 500k 中过滤掉 50 个用户!另请注意,您将为 500K 读取次数付费,而不是 50 次(请参阅 pricing)。
因此,仅获取您想要的文档(即恰好 50 个用户)是最有效的方法。自 get()
方法是异步的,返回一个Promise,可以使用 Promise.all()
如下:
const matchingUsers = [user1, user2, user3, ..., user50];
const promises = matchingUsers.map(u => db.collection('users').doc(u).get());
Promise.all(promises).then(results => {
//results is an array of DocumentSnapshots
//use any array method, like map or forEach
results.map(docSnapshot => {
console.log(docSnapshot.data());
});
});
正如文档中所解释的,Promise.all()
的优点是“它返回一个单个 Promise,当所有 Promise 作为可迭代对象传递时,该 Promise 就会得到满足”已完成”,使得管理不同的异步并行调用变得非常容易。
关于javascript - 单个文档的多个请求和 500000 个文档的单个请求(Cloud Firestore)哪个性能更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60575945/