繁体   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