【问题标题】:Firebase Writing and Updating data concurrency?Firebase 写入和更新数据并发?
【发布时间】:2021-01-07 09:48:54
【问题描述】:

在我的网站中,我为用户提供裁剪 pdf 并将其作为 jpeg 提供的服务。

我将 pdf 和 jpeg 保存到存储中,以查看函数是否按预期执行。

在我的函数中,我想将 pdf 和 jpeg 的路径保存到 firestore,以便在我的自定义仪表板上查看。

数据结构是这样的:

集合“PDFPublic”>文档“一月”>集合“07”>文档“信息”>PDF AND IMAGE PATH FIELDS

我将它们保存在几个月的文档中(作为类别)以及天的子集合和名为 Info 的文档。

我检查文档的存在并像这样创建它:

let docRef = database.collection("PDFPublic").doc("January").collection("10").doc("Info");
    let doc = await docRef.get();

    if (doc.exists) {
        await docRef.update({ Links: firebase.firestore.FieldValue.arrayUnion({ image: pathtostorage, pdf: pathtostorage }) }).catch((e) => console.log(e));
    } else {
        await docRef.set({ Links: [{ image: pathtostorage, pdf: pathtostorage }] }).catch((e) => console.log(e));
    } 

我为同一天转换的 pdf 创建了一个数组。

现在的问题是,如果两个或更多用户在新的一天(比如 1 月 10 日)同时执行该函数,他们将找不到文档,并将使用 set 方法重新创建该字段。

在这种情况下,大部分数据将丢失/覆盖。

这种情况如何处理??

【问题讨论】:

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


    【解决方案1】:

    您应该使用set() 方法与合并选项,如下所示:

    let docRef = database.collection("PDFPublic").doc("January").collection("10").doc("Info");
    let doc = await docRef.get();
    await docRef.set(
         { Links: firebase.firestore.FieldValue.arrayUnion({ image: pathtostorage, pdf: pathtostorage }) },
         { merge: true }
    ).catch((e) => console.log(e));
    

    正如doc 中解释的那样,这将产生以下效果:如果文档不存在,则会创建它。如果文档确实存在,则将数据合并到现有文档中,而不覆盖整个文档。

    【讨论】:

    • @RenuadTarnec 在我需要处理的情况下,给定的答案并没有多大帮助。让我尝试更好地解释它(我希望),10 个用户触发该功能以使用它。函数执行它检查是否存在当前日期的文档。如果不是,它会尝试创建文档,否则如果找到,那么它将简单地执行更新操作。案例是,如果每个执行的函数都尝试创建文档并使用 set 函数,那么数据将被新的覆盖,因为使用 set 不会更新但会创建数据。我不想让这种事情发生。
    • @ChandraShekharAazad 您在评论中提到的set() 方法并不完全正确:如果您使用set() 方法没有合并选项,它确实有效正如您所描述的:只要您调用它,它就会创建一个新文档或覆盖现有文档。但是,当与合并选项一起使用时,set() 方法的行为是不同的:如果文档不存在,它将创建它(就像 set() 方法没有合并选项确实)。
    • 但是,如果文档已经存在,set() 方法带有合并选项覆盖它但它的行为与update() 方法完全一样,更新传递给该方法的字段,但保持其他字段不变。因此,我再次认为这是您问题的解决方案。有关doc 中合并选项的更多信息。
    • 另外,看看下面的答案:stackoverflow.com/a/46600599/3371862
    • @ChandraShekharAazad 您好,您有机会查看其他 cmets/说明吗?
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多