哪一个是针对单个文档的性能多请求,还是针对500000个文档的单个请求(Cloud Firestore)



我想从cloud firestore中获取50个用户,两种方法都有。但实际上我不知道哪一个是表演性的,因为我们国家的互联网连接很差,if our focus be only fetching not iterating

  1. 第一种方式(单个请求(

    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);
    }
    });
    });
    }
    
  2. 第二种方式(多次请求(

    matchingUsers.forEach(async user => {
    const snap = await db.collection('users').doc(user).get();
    tempList.push(snap.data().user)
    });
    

使用第一种方法,您实际上是在获取整个用户集合,并将所有相应的数据从后端(Firestore(传输到前端。这真的没有效率,尤其是如果你想过滤掉50万个用户的话!另外请注意,您将为50万次阅读付费,而不是50次(请参阅定价(。

因此,只获取您想要的文档(即正好为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就会实现",这使得管理不同的异步并行调用变得非常容易。

最新更新