Firestore Сравнение двух документов коллекции очень медленно - PullRequest
0 голосов
/ 12 февраля 2019

В настоящее время я загружаю телефонные контакты моих мобильных пользователей в базу данных Firestore.

В среднем у пользователя ~ 500 телефонных номеров, а у меня будет ~ 1000 пользователей.

Моя структура выглядит следующим образом:

Firestore-root
    |
    --- users_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- phoneNumberOfContact: true

И у меня есть еще одна коллекция, где я храню общие телефонные номера, с которыми я хочу сравнить контакты конкретного пользователя.

У меня около 50 000 телефонных номеровтам, каждый как документ.Это значительно увеличится позже, возможно, до 1 млн.

Firestore-root
    |
    --- db_contacts (collection)
         |
         --- phoneNumber (document)
              |
              --- phoneNumber: true

Я пытаюсь проверить общие номера определенного известного uid и коллекции db_contacts.Сколько номеров известных идентификаторов uid существует в коллекции db_contacts.

Функция My Cloud будет выглядеть следующим образом:

  1. Получить все номера телефонов контакта
    • Сначала я хотел получить только идентификаторы документа пользователя, поскольку идентификатор - это номер телефона, надеясь, что это ускорит процесс.Но это кажется невозможным в Javascript, так как snapshotChanges () не существует.
  2. Переберите извлеченные контакты и проверьте, существует ли этот контакт в db_contacts.Поскольку я уже знаю путь ссылки, чтобы проверить, существует ли он или нет, он должен идти быстро
  3. Возвращать все общие контакты

Если в JavaScript была альтернатива snapshotChanges ()мой сценарий будет работать намного быстрееПравильно ли мое мышление?

Что я делал до сих пор:

exports.findCommonNumbers = functions.https.onCall((data, context) => {
    return new Promise((resolve, reject) => {
        fetchCommonNumbers().then((commonNumbers) => {
            console.log(commonNumbers);
            resolve("Done");
        }).catch((err) => {
            console.log(err);
            reject("Error Occured");
        });


    });
});

async function fetchCommonNumbers() {
    var commonNumbers = [];

    let contactsReference = admin.firestore().collection("user_contacts").doc("iNaYVsDCg3PWsDu67h75xZ9v2vh1").collection("contacts");
    const dbContactReference = admin.firestore().collection('db_contacts');

    userContacts = await contactsReference.get();
    userContacts = userContacts.docs;
    for(var i in userContacts){
        var userContact = userContacts[i];
        const DocumentID = userContact.ref.id;
        //Check if Document exist 
        dbContact = await dbContactReference.doc(DocumentID).get();
        if (dbContact.exists) {
            commonNumbers.push(DocumentID);
        }
    }

    return Promise.resolve(commonNumbers);
}

Функция findCommonNumbers занимает 60 секунд для выполнения.Это должно быть намного быстрее.Как я могу сделать это быстрее?

1 Ответ

0 голосов
/ 12 февраля 2019

Когда вы ищете общие документы, вы выбираете один, ожидаете его возвращения, получаете следующий, ожидаете его ... Я раньше не использовал async / await, но я бы хотелсделать что-то вроде:

Promise.All(userContacts.map(userContact => {
    const DocumentID = userContact.ref.id;
    //Check if Document exists
    return dbContactReference.doc(DocumentID).get().then(dbContact => {
        if (dbContact.exists) {
            commonNumbers.push(DocumentID);
        }
    });
}));

Извините за фрагмент кода и ошибки;Я на мобильном телефоне.Это должно запросить их всех сразу.

Редактировать: возвращать после того, как что-то отличное от всех вернулось:

new Promise((resolve, reject) => {
    var returned = 0;
    userContacts.map(userContact => {
        const DocumentID = userContact.ref.id;
        //Check if Document exists
        dbContactReference.doc(DocumentID).get().then(dbContact => {
            if (dbContact.exists) {
                commonNumbers.push(DocumentID);
            }
            returned++;
            if (returned == userContact.length || commonNumbers.length >= 5) {
                resolve(commonNumbers);
            }
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...