Firestore比较两个收集文档非常慢

时间:2019-02-11 22:21:16

标签: javascript node.js firebase google-cloud-firestore

我当前正在将移动用户的电话联系人上载到Firestore数据库。

平均每个用户拥有约500个电话号码,而我将拥有约1000个用户。

我的结构如下:

Firestore-root
    |
    --- users_contacts (collection)
         |
         --- uid (document)
              |
              --- contacts (subcollection)
                   |
                   --- phoneNumberOfContact (document)
                          |
                          --- phoneNumberOfContact: true

还有另一个集合,用于存储我想与特定用户的联系人进行比较的常规电话号码。

我大约有50,000个电话号码,每个都作为文件。以后将大大增加,可能达到一百万。

Firestore-root
    |
    --- db_contacts (collection)
         |
         --- phoneNumber (document)
              |
              --- phoneNumber: true

我正在尝试检查特定已知uid和db_contacts集合的公用号。 db_contacts集合中存在多少个已知的uid。

我的云功能如下:

  1. 获取联系人的所有电话号码
    • 首先,我只想获取用户文档的ID,因为ID是电话号码,希望它可以使处理更快。但这似乎在Javascript中是不可能的,因为snapshotChanges()不存在。
  2. 遍历获取的联系人,并检查该联系人是否存在于db_contacts中。由于我已经知道用于检查参考路径是否存在的参考路径,因此应该可以快速执行
  3. 返回所有常用联系人

如果JavaScript中有快照更改()的替代方法,我的脚本将运行得更快。我的思维方式正确吗?

我到目前为止所做的:

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秒才能执行。它必须要快得多。我怎样才能更快?

1 个答案:

答案 0 :(得分:3)

当您寻找共同的文档时,您正在获取一个文档,等待它回来,获取下一个文档,等待它...我以前没有使用过async / await,但是我会做类似的事情:

Promise.All(userContacts.map(userContact => {
    const DocumentID = userContact.ref.id;
    //Check if Document exists
    return dbContactReference.doc(DocumentID).get().then(dbContact => {
        if (dbContact.exists) {
            commonNumbers.push(DocumentID);
        }
    });
}));

很抱歉代码片段和错误;我正在使用手机。这应该立即要求他们全部。

编辑:在所有内容都不返回之后返回:

new Promise((resolve, reject) => {
    var returned = 0;
    userContacts.map(userContact => {
        const DocumentID = userContact.ref.id;
        //Check if Document exists
        dbContactReference.doc(DocumentID).get().then(dbContact => {
            if (dbContact.exists) {
                commonNumbers.push(DocumentID);
            }
            returned++;
            if (returned == userContact.length || commonNumbers.length >= 5) {
                resolve(commonNumbers);
            }
        });
    });
});