При первом способе вы фактически извлекаете всю коллекцию пользователей и передаете все соответствующие данные из серверной части (Firestore) на ваш интерфейс. Это действительно неэффективно, особенно если вы хотите отфильтровать 50 пользователей из 500 тысяч! Также обратите внимание, что вы будете платить за 500 тыс. Чтений вместо 50 (см. расценки ).
Так что выборка только для тех документов, которые вы хотите (т.е. для ровно 50 пользователей), является наиболее эффективным способом , Поскольку метод get()
является асинхронным и возвращает Обещание, вы можете использовать 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());
});
});
Как объяснено в do c преимущество Promise.all()
состоит в том, что «он возвращает одиночное обещание , которое выполняется, когда все обещания, переданные как итеративные, выполнены», что делает действительно простым управление различными асинхронными параллельными вызовами.