簡體   English   中英

對於此用例,最有效的 Firestore 模型是什么?

[英]What is the most efficient firestore model for this use case?

在我的應用程序中,我目前有三個集合:

db_contacts

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

db_contacts包含我在 head 之前添加的手機列表。 該集合稍后將包含大約 100 萬個電話號碼。 目前它只有 50,000 個電話號碼(50,000 個文件)。

users_contacts

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

users_contacts保存了我的應用程序上每個用戶的所有電話號碼。 該應用程序將被大約 10,000 名用戶使用,每個用戶擁有約 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 上設置的事件掛鈎上填充此集合。

我的用例

我需要創建一個額外的集合,用於存儲 users_common_contacts 中用戶的唯一聯系人。 只有該用戶的聯系人與 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

由於db_contacts集合已經包含了所有用戶的所有電話號碼,因此您不需要將用戶電話號碼的唯一性與db_contacts集合中存在的號碼進行比較,您需要檢查用戶的號碼是否存在於其他用戶中聯系人列表。 換句話說,您需要檢查一個號碼與其他用戶聯系人相比是否唯一。 因此,您需要獲取用戶擁有的每個號碼並檢查它是否存在於其他用戶聯系人列表中。 在這種情況下,您應該通過添加如下新集合來稍微更改數據庫架構:

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

看, uid文檔現在只包含一個地圖,因此它可以容納 1MiB,這是文檔的最大大小。 您的查詢應如下所示:

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

現在你只需要獲取數據。 如果snapshot存在則表示它不是唯一的,如果不存在則表示它是唯一的。 如果需要,您還可以將這些數字存儲在數組中。 因此,由您決定哪種解決方案更適合您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM