Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 对于这个用例,最有效的firestore模型是什么?_Node.js_Firebase_Nosql_Google Cloud Firestore - Fatal编程技术网

Node.js 对于这个用例,最有效的firestore模型是什么?

Node.js 对于这个用例,最有效的firestore模型是什么?,node.js,firebase,nosql,google-cloud-firestore,Node.js,Firebase,Nosql,Google Cloud Firestore,在我的应用程序中,我目前有三个收藏: db\u联系人 Firestore-root | --- db_contacts (collection) | --- phoneNumber (document) | --- 'phone': phoneNumber Firestore-root | --- users_contacts (collection)

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

db\u联系人

Firestore-root
    |
    --- db_contacts (collection)
         |
         --- phoneNumber (document)
              |
              --- 'phone': phoneNumber
Firestore-root
    |
    --- users_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_common_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_unique_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
db_contacts保存着我在head前面添加的手机列表。该系列稍后将包含约100万个电话号码。目前它只拥有50000个电话号码(50000个文档)

用户\u联系人

Firestore-root
    |
    --- db_contacts (collection)
         |
         --- phoneNumber (document)
              |
              --- 'phone': phoneNumber
Firestore-root
    |
    --- users_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_common_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_unique_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
users\u contacts保存我应用程序中每个用户的所有电话号码。该应用程序将被约10000名用户使用,每个用户拥有约500个联系人。因此,我将有10000个uid文档,每个文档在contacts子集合中有~500个phoneNumberOfContact文档

用户\u普通\u联系人

Firestore-root
    |
    --- db_contacts (collection)
         |
         --- phoneNumber (document)
              |
              --- 'phone': phoneNumber
Firestore-root
    |
    --- users_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_common_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_unique_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
users_common_contacts包含用户已在db_contacts中的联系人。我在users\u contacts onWrite上设置的事件挂钩上填充此集合

我的用例 我需要创建一个额外的集合,用于存储用户的唯一联系人,这些联系人位于users\u common\u联系人中。只有该用户与db_联系人有共同点,其他用户没有的联系人

到目前为止,我所做的,并被证明是一个错误是:

用户\u唯一\u联系人

Firestore-root
    |
    --- db_contacts (collection)
         |
         --- phoneNumber (document)
              |
              --- 'phone': phoneNumber
Firestore-root
    |
    --- users_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_common_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
Firestore-root
    |
    --- users_unique_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- 'phone': phoneNumberOfContact
我的问题 我无法正确填充此表,因为无法找到单个用户的唯一联系人。我的填充用户\u唯一\u联系人的代码如下:

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\u common\u contacts中。哪些联系人只有此用户与db\u contacts有共同之处,而其他用户没有。”

假设db_联系人具有以下号码:

  • 111111
  • 2222222
  • 333333
  • 444444
  • 555555
  • 123456
用户A与db_联系人有以下共同号码:

  • 111111
  • 2222222
  • 555555
  • 444444
  • 123456
用户B与db_联系人有以下共同号码:

  • 111111
  • 2222222
  • 333333
  • 555555
现在,用户A是唯一具有以下共同数字的用户:

  • 444444
  • 123456
现在,用户B是唯一具有以下共同数字的用户:

  • 333333
因此,用户A的唯一编号为:

  • 444444
  • 123456
因此用户B的唯一编号为:

  • 333333

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

Firestore-root
   |
   --- allUsersNumbers (collection)
         |
         --- uid (document)
             |
             --- phoneNumbers (map)
                   |
                   --- phoneNumberOne: true
                   |
                   --- phoneNumberTwo: true
请参见,
uid
document现在只保存一个映射,因此它可以放入1MiB,这是文档的最大大小。您的查询应该是这样的:

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

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

“我需要创建一个额外的集合,用于存储用户的唯一联系人,这些联系人位于用户公用联系人中。哪些联系人只有该用户与db公用联系人有共同点,而其他用户没有。”不是所有联系人都是唯一的,因为用户联系人在这两个地方都存在吗?想要的结果是什么?@AlexMamo嘿!我添加了一个例子,希望能够解释我的意思。谢谢:)非常感谢你的回答。我为性能问题添加了通用数字集合。我想搜索包含较少内容的普通号码比搜索所有用户号码要快?另一个问题,添加大约1000个电话号码的数组可以吗?谢谢你,亚历克斯!哦,我想你把db_联系人错当成了用户联系人。幸运的是,Firestore不支持一次性。因此,您肯定需要将这些数据存储在单个集合中,以便可以查询。您明白了吗?是的,谢谢。我只是在检查如何从地图中删除一个特定项目,所以当用户的电话号码不再唯一时,如何从地图中删除该特定号码。我将此标记为已解决:)