我目前正在将手机用户的联系人上传到Firestore数据库中,这些内容与IT技术有关。
平均每个用户有约500个电话号码,而我将有大约1000个用户。
我的结构如下:
Firestore-root
|
--- users_contacts (collection)
|
--- uid (document)
|
--- contacts (subcollection)
|
--- phoneNumberOfContact (document)
|
--- phoneNumberOfContact: true
我有另一个收集,其中存储了一般电话号码,我想将一个特定用户的联系人与其进行比较。
我的收集中大约有50,000个电话号码,每个都作为一个文档。这将在之后大大增加,可能会增加到1百万。
Firestore-root
|
--- db_contacts (collection)
|
--- phoneNumber (document)
|
--- phoneNumber: true
我正在尝试检查一个特定已知uid和db_contacts集合中的公共号码。已知uid在db_contacts集合中存在多少个号码。
我的云功能将如下所示:
- 获取联系人的所有电话号码
- 起初,我只想获取用户文档的id,因为该id是电话号码,希望这样做可以加快过程。但是似乎在JavaScript中不可能实现,因为snapshotChanges()不存在。
- 循环遍历获取的联系人,并检查联系人是否存在于db_contacts中。由于我已经知道要检查它是否存在的引用路径,因此这应该会很快。
- 返回所有公共联系人
到目前为止,我已经做了什么:
exports.findCommonNumbers = functions.https.onCall((data, context) => {
return new Promise((resolve, reject) => {
fetchCommonNumbers().then((commonNumbers) => {
console.log(commonNumbers);
resolve("Done");
}).catch((err) => {
console.log(err);
reject("Error Occured");
});
});
});
async function fetchCommonNumbers() {
var commonNumbers = [];
let contactsReference = admin.firestore().collection("user_contacts").doc("iNaYVsDCg3PWsDu67h75xZ9v2vh1").collection("contacts");
const dbContactReference = admin.firestore().collection('db_contacts');
userContacts = await contactsReference.get();
userContacts = userContacts.docs;
for(var i in userContacts){
var userContact = userContacts[i];
const DocumentID = userContact.ref.id;
//Check if Document exist
dbContact = await dbContactReference.doc(DocumentID).get();
if (dbContact.exists) {
commonNumbers.push(DocumentID);
}
}
return Promise.resolve(commonNumbers);
}
函数findCommonNumbers执行需要60秒,必须更快。如何加速?