如何确保每次创建新文档时云功能都在运行?

时间:2020-06-30 07:23:36

标签: firebase google-cloud-firestore

我正在将测验的问题和答案上传到Firestore。为此,我正在使用以下功能:

const firestore = admin.firestore();
const settings = { timestampsInSnapshots: true };

firestore.settings(settings);
if (data && (typeof data === "object")) {
   Object.keys(data).forEach(docKey => {
      var data_to_push = data[docKey];
      data_to_push['category'] = "Wirtschaft";
      firestore.collection(collectionKey).add(data_to_push).then((res) => {
         console.log("Document " + docKey + " successfully written!");
      }).catch((error) => {
         console.error("Error writing document: ", error);
      });
   });

此功能可以正常工作,创建了我需要的所有文档,但是只要创建了文档,我就有另一个正在运行的功能:

// This function adds the doc ids of newly created questions to an arrayList
exports.AddKeyToArray = functions.region('europe-west1').firestore.document('Questions/{nameId}').onCreate(async (snp, context) => {
    console.log(snp.id);
    console.log(context.params);
    await db.collection("Questions_keys").doc(snp.data().category).update({ "questions": admin.firestore.FieldValue.arrayUnion(snp.id) }).then(() => {
        return console.log("Key  added");
    }).catch(async (e) => {
        console.log(e);
        if (e.code === 5) {
            await db.collection("Questions_keys").doc(snp.data().category).set({ "questions": admin.firestore.FieldValue.arrayUnion(snp.id) }).then(() => {
                return console.log("First time key added");
            }).catch(e => {
                return console.log(e);
            })
        }
    })
    return "okay";
})

此函数基本上获取先前添加的问题/答案的文档ID,并创建一个包含该测验类别的所有文档ID的数组(因此,我随后可以在不进行大量阅读操作的情况下获得随机问题)。问题在于,并非所有文档ID都添加到数组中,所以我想知道是否有更好的方法来确保将所有文档ID添加到数组中。

我有时一次上传500个文档,这是一种减少一次上传的文档以确保第二功能更好的性能的解决方案吗?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我建议不要在这里使用云功能,而是在数据库中创建另一个集合。这样,您可以轻松地向该集合中添加更多问题。这种设计将提高性能,因为您只需要直接查询新集合即可,从而避免了管理和使用Cloud Functions所需的所有麻烦。

答案 1 :(得分:0)

在帮助下,我找到了一个解决方案:以下函数将数据上传到firestore并获取文档ID,并将其设置为数组:

...
const firestore = admin.firestore();
const settings = { timestampsInSnapshots: true };

firestore.settings(settings);
if (data && (typeof data === "object")) {
    Object.keys(data).forEach(async docKey => {
        var data_to_push = data[docKey];
        data_to_push['category'] = "Deutschland";

        await firestore.collection(collectionKey).add(data_to_push).then(async (res) => {
          var key = (res['_path']['segments'][1]);
            await firestore.collection("Questions_keys").doc(data_to_push['category']).update({ "questions": admin.firestore.FieldValue.arrayUnion(key) }).then(() => {
                 console.log("Key  added: " + key);
            }).catch(async (e) => {
              if (e.code === 5) {
                  await firestore.collection("Questions_keys").doc(data_to_push['category']).set({ "questions": admin.firestore.FieldValue.arrayUnion(key) }).then(() => {
                      return console.log("First time key added");
                  }).catch(e => {
                      return console.log(e);
                  })
              }
                console.log(e);

            })
        }).catch((error) => {
            console.error("Error writing document: ", error);
        });
    });
}