在我的应用中,我目前有三个收藏夹:
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具有以下数字:
用户A 与db_contacts具有以下共同点:
用户B 与db_contacts具有以下共同点:
现在用户A 是唯一具有以下数字的用户:
现在用户B 是唯一具有以下数字的用户:
所以用户A 的唯一编号是:
所以用户B 的唯一编号是:
答案 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}}存在,则表示唯一。如果需要,还可以将这些数字存储在数组中。因此,由您决定哪种解决方案更适合您。