Какова наиболее эффективная модель пожарного депо для этого варианта использования? - PullRequest
0 голосов
/ 18 февраля 2019

В моем приложении у меня есть три коллекции:

db_contacts

Firestore-root
    |
    --- db_contacts (collection)
         |
         --- phoneNumber (document)
              |
              --- 'phone': phoneNumber

db_contacts содержит список мобильных телефонов, которые я добавляюперед головой.Коллекция будет содержать около 1 миллиона номеров телефонов позже.В настоящее время он содержит только 50000 phoneNumber (50000 документов).

users_contacts

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

users_contacts содержит все номера телефонов каждого пользователя намое приложение.Приложение будет использоваться около 10000 пользователей, каждый из которых имеет ~ 500 контактов.Так что у меня будет 10 000 документов uid, и у каждого будет ~ 500 phoneNumberOfContact документ внутри подколлекции контактов.

users_common_contacts

Firestore-root
    |
    --- users_common_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact

users_common_contacts содержитконтакты пользователя уже есть в db_contacts .Я заполняю эту коллекцию обработчиком событий, установленным в users_contacts onWrite.

Мой вариант использования

Мне нужно создать дополнительную коллекцию, в которой хранятся уникальные контакты пользователя, находящиеся внутри.пользователи_коммон_контакты.Какие контакты только у этого пользователя имеют общее с db_contacts и что нет у других пользователей.

То, что я сделал до сих пор и оказалось ошибкой, заключается в следующем:

users_unique_contacts

Firestore-root
    |
    --- users_unique_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact

Моя проблема

Я не мог правильно заполнить эту таблицу, поскольку нет способа найти уникальные контакты одного пользователя.Мой код для заполнения users_unique_contacts выглядит следующим образом:

exports.userCommonContactsListener =
    functions.firestore.document('users_common_contacts/{userID}/contacts/{documentID}')
        .onCreate((snap, context) => {
            const DocumentID = context.params.documentID;
            const UserID = context.params.userID;

            const uniqueContactsRef = admin.firestore().collection('users_unique_contacts').doc(UserID).collection("contacts");

            return new Promise((resolve, reject) => {

                uniqueContactsRef.where('phone', '==', DocumentID).get().then(contactSnapshot => {
                    if (contactSnapshot.size > 0) {
                        console.log(`Found Common Number in Unique ${contactSnapshot}`);
                        contactSnapshot.forEach(documentSnapshot => {
                            documentSnapshot.ref.delete();
                            console.log(`Deleted ${documentSnapshot.ref.id} as unique contact`);
                            resolve(`Deleted ${documentSnapshot.ref.id} as unique contact`);
                        });
                    } else {
                        var db_contacts = {}
                        db_contacts['phone'] = DocumentID;
                        db_contacts['timestamp'] = new Date();
                        uniqueContactsRef.doc(DocumentID).set(db_contacts, { merge: true }).then((res) => {
                            console.log(`Added ${DocumentID} as unique contact`);
                            resolve(`Added ${DocumentID} as unique contact`);
                        }).catch((err) => {
                            console.log(err);
                            reject("Error Removing Unique Contact", err);
                        });;
                    }
                });
            });

        });

Код не работает, uniqueContactsRef.where('phone', '==', DocumentID).get() никогда не возвращает никаких значений.

Как мне перейтив моделировании мои users_unique_contacts ?

Обновление:

Дальнейшее объяснение

Что я подразумеваю под: "Мне нужно создать дополнительную коллекцию, в котором хранятся уникальные контакты пользователя, которые находятся внутри users_common_contacts. Какие контакты только этот пользователь имеет общего с db_contacts и что ни один другой пользователь не имеет. "

Допустим, db_contacts имеют следующие номера:

  • 111111
  • 222222
  • 333333
  • 444444
  • 555555
  • 123456

Пользователь A имеет общие с db_contacts следующие номера:

  • 111111
  • 222222
  • 555555
  • 444444
  • 123456

Пользователь B имеет общее с db_contacts следующимнизкие цифры:

  • 111111
  • 222222
  • 333333
  • 555555

Сейчас Пользователь A - это единственное число, которое объединяет следующие цифры:

  • 444444
  • 123456

Теперь Пользователь B являетсяединственное, что объединяет следующие цифры:

  • 333333

Итак Пользователь A имеет следующие уникальные номера:

  • 444444
  • 123456

Итак Уникальные номера пользователя B :

  • 333333

1 Ответ

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

Поскольку коллекция db_contacts уже содержит все телефонные номера всех пользователей, вам не нужно сравнивать уникальность телефонных номеров пользователей с тем, что существует в коллекции db_contacts, вам нужно проверить, есть ли номера у пользователясуществует или нет в другом списке контактов пользователя.Другими словами, вам нужно проверить, является ли номер уникальным по сравнению с другими контактами пользователя.Таким образом, вам нужно получить каждый номер, который есть у пользователя, и проверить, существует ли он в списке контактов другого пользователя.В этом случае вам следует немного изменить схему базы данных, добавив новую коллекцию, например:

Firestore-root
   |
   --- allUsersNumbers (collection)
         |
         --- uid (document)
             |
             --- phoneNumbers (map)
                   |
                   --- phoneNumberOne: true
                   |
                   --- phoneNumberTwo: true

См., uid документ теперь содержит только карту, поэтому он может уместиться в 1MiB,который является максимальным размером документа.Вот как должен выглядеть ваш запрос:

allUsersNumbersRef.where('phoneNumbers.searchedPhoneNumber', '==', true);

Теперь вам нужно только получить данные.Если snapshot существует, это означает, что он не уникален, если не существует, это означает, что он уникаленВы также можете хранить эти числа в массиве, если хотите.Поэтому вам решать, какое решение лучше для вас.

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