云功能:FieldValue.increment()的事务未自动运行

时间:2019-12-03 14:35:44

标签: google-cloud-firestore google-cloud-functions

我有一个Cloud Functions事务,该事务使用FieldValue.increment()更新嵌套地图,但是它不是原子运行的,因此值更新不准确(快速连续运行事务会导致计数错误) )。

该功能通过以下方式触发:

export const updateCategoryAndSendMessage= functions.firestore.document('events/{any}').onUpdate((event, context) => {

其中包括以下交易:

db.runTransaction(tx => {
    const categoryCounterRef = db.collection("data").doc("categoryCount")
    const intToIncrement = event.after.data().published == true ? 1 : -1;
    const location = event.after.data().location;

    await tx.get(categoryCounterRef).then(doc => {

        for (const key in event.after.data().category) {
            event.after.data().category[key].forEach(async (subCategory) => {
                const map = { [key]: { [subCategory]: FieldValue.increment(intToIncrement) } };
               await tx.set(categoryCounterRef, { [location]: map }, { merge: true })
            })
        }
    },
    ).then(result => {
        console.info('Transaction success!')
    })
        .catch(err => {
            console.error('Transaction failure:', err)
        })
}).catch((error) => console.log(error));
  

示例:

     

要增加的字段值:0

     

点击按钮可连续多次执行该功能(在“已发布”的true和false之间进行切换)

     

期望值:0或1(取决于参考文档的值是true还是false)

     

实际值:-3、5,-2等

     

据我所知,交易应“先到先得”执行,以避免数据不准确。似乎该函数未正确“排队”-因为缺少更好的单词。

我有点困惑,不胜感激与此有关的任何指导。

1 个答案:

答案 0 :(得分:1)

哦,天哪,我错过了退货...

return db.runTransaction(tx => {