Node.js 对于这个用例,最有效的firestore模型是什么?
在我的应用程序中,我目前有三个收藏: db\u联系人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)
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
- 111111
- 2222222
- 555555
- 444444
- 123456
- 111111
- 2222222
- 333333
- 555555
- 444444
- 123456
- 333333
- 444444
- 123456
- 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不支持一次性。因此,您肯定需要将这些数据存储在单个集合中,以便可以查询。您明白了吗?是的,谢谢。我只是在检查如何从地图中删除一个特定项目,所以当用户的电话号码不再唯一时,如何从地图中删除该特定号码。我将此标记为已解决:)