В настоящее время я загружаю телефонные контакты моих мобильных пользователей в базу данных 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 будет выглядеть следующим образом:
- Получить все номера телефонов контакта
- Сначала я хотел получить только идентификаторы документа пользователя, поскольку идентификатор - это номер телефона, надеясь, что это ускорит процесс.Но это кажется невозможным в Javascript, так как snapshotChanges () не существует.
- Переберите извлеченные контакты и проверьте, существует ли этот контакт в db_contacts.Поскольку я уже знаю путь ссылки, чтобы проверить, существует ли он или нет, он должен идти быстро
- Возвращать все общие контакты
Если в 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 секунд для выполнения.Это должно быть намного быстрее.Как я могу сделать это быстрее?