Какой является многократным запросом для одного do c или одного запроса для 500000 документов (Cloud Firestore)? - PullRequest
0 голосов
/ 07 марта 2020

Я хочу получить 50 пользователей из cloud firestore, и у меня есть два способа, оба работают. Но на самом деле я не знаю, какой из них эффективен, так как у нас плохое соединение inte rnet в нашей стране, 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)
    
    });
    

1 Ответ

2 голосов
/ 07 марта 2020

При первом способе вы фактически извлекаете всю коллекцию пользователей и передаете все соответствующие данные из серверной части (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() состоит в том, что «он возвращает одиночное обещание , которое выполняется, когда все обещания, переданные как итеративные, выполнены», что делает действительно простым управление различными асинхронными параллельными вызовами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...