Firestore云功能。事务vs get()=> update()

时间:2018-10-25 23:45:27

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

我有一个文档,其中包含一个由整数数组组成的字段,该文档每天(每周7天)通过onCreate()触发器创建一次。我需要计算数组中每个项目的出现次数。在其他应用程序中,我先使用get(),然后使用set()(或update())。我将在数组中运行一个for循环,并将所有的Promise添加到一个Promise数组中,并在末尾:Promise.all{promisesArray}

刚刚发现了有关交易的信息,对于我非常基本的javascript来说就可以了。

我的问题是我应该使用哪一个?在我的情况下使用交易有什么好处?该文档是由管理员而非最终用户创建的,不是说它将由数百万个用户创建。

下面是我用来计算出现次数的代码:

// Ref.get() then Ref.update()
promisesArray.push(docRef.get()
    .then(doc => {
        return docRef.update('count', doc.data().count + 1);
    })).catch(error => {
    console.log("Error" + error);
});

// Using a Transaction
promisesArray.push(firestore.runTransaction(transaction => {
    return transaction.get(docRef)
        .then(doc => {
            return transaction.update(docRef, {
                count: doc.data().count + 1
            });
        });
}).catch(error => {
    console.log("Error" + error);
}));

1 个答案:

答案 0 :(得分:2)

如果您知道一个文档在任何时候都只能由一个程序编写,则不需要进行事务处理。事务的目的是处理多个用户/程序可能都试图同时编写文档的情况。或者,您需要在一次写入操作中自动更新一堆文档,以确保所有文档之间的一致性。

如果在onCreate期间仅在Cloud Function中编写单个文档,则可能不需要事务。由于某些通用计算的结果,如果您需要多个文档在同一时间全部出现,那么您可能确实需要进行事务处理。