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

时间:2019-02-18 12:36:47

标签: node.js firebase nosql google-cloud-firestore

在我的应用中,我目前有三个收藏夹:

db_contacts

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

db_contacts 保留了我添加的手机列表。以后将包含大约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有什么联系,而其他用户则没有。” < / p>

让我们说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 :(得分:1)

由于db_contacts集合已经包含所有用户的所有电话号码,因此您无需将用户电话号码的唯一性与db_contacts集合中存在的电话号码进行比较,因此需要检查是否用户在其他用户联系人列表中拥有,存在或不存在的号码。换句话说,与其他用户联系人相比,您需要检查号码是否唯一。因此,您需要获取用户拥有的每个号码,并检查它是否存在于其他用户联系人列表中。在这种情况下,您应该通过添加这样的新集合来稍微更改数据库模式:

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

请参阅,uid文档现在仅包含地图,因此它可以容纳1MiB,这是文档的最大大小。这是查询的样子:

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

现在您只需要获取数据。如果snapshot存在,则表示不唯一;如果{{1}}存在,则表示唯一。如果需要,还可以将这些数字存储在数组中。因此,由您决定哪种解决方案更适合您。