Cloud Firestore文档的事务写入比预期的要高。我需要更改什么?

时间:2019-09-01 11:56:22

标签: reactjs transactions google-cloud-firestore

此问题与Cloud Firestore和React有关。

问题

我有几个输入字段的表单(输入字段的数量取决于大小写)。将数据提交到Cloud Firestore文档时,我正在使用Cloud Firestore事务进行处理。这种特定的写操作应该只能是一次写操作,但是在数据库->使用情况下查看写操作,我可以看到该特定写操作的写操作次数增加了很多。

我做过的步骤以查看它会增加多少

我创建了一个Cloud Function,用于记录数据库中的每个Document Write。我跟进了两次提交,两次都在表单中有7个输入字段。

第一次:在提交之前写数为332。提交后,Cloud Function日志显示仅更新了一个Document Write(这是正确的),但是写入增加到393。增加了61个写入?

第二次:提交之前写入393次(这是相同的表单,但是对于另一个用户/标识(在这种情况下为乘员),因此,这比第一次提交到另一个文档。提交表单数据后,云函数再次向我显示对该特定文档执行了一次文档写操作,但是现在写操作从393增加到513。增加了120个写操作!?

该应用程序用于骑行比赛,每个法官都应为每个骑手在每个不同的骑课中提交表格数据。昨天在实时测试中,我不得不将Firestore计划从免费计划中更新为每天200.000个写入(每天20.000个写入),因为昨天我们在大约45分钟内达到了20.000个写入,如果您进行了数学计算,那是不可能的

此特定案例适用于Switch中的“初步”案例,但也适用于“最终”案例。

有人可以告诉我我的提交功能有什么问题/需要更改吗?

    const submitScore = (uid, event) => {
        event.preventDefault()

        const rider = riders.filter(rider => rider.uid === uid)
        const riderDoc = firebase.rider(uid)

      /* initalMarks is the marks/points that every rider already haves 
         from the current judge in the DB, and localMarks is the values
         the judge has set locally and is going to update the marks in 
         the DB */

        const mergedMarksObj = { ...initialMarks, ...localMarks }

        switch (type) {
            case 'final':
                Object.keys(mergedMarksObj).forEach((riderUid, idx) => {
                    firebase.db
                        .runTransaction(transaction => {
                            return transaction.get(firebase.rider(riderUid)).then(doc => {
                                if (doc.exists) {
                                    const totMarks = {
                                        ...initialMarks[doc.id],
                                        ...localMarks[doc.id],
                                    }
                                    transaction.update(firebase.rider(riderUid), {
                                        marks: {
                                            ...doc.data().marks,
                                            [judgeId]: {
                                                marks: {
                                                    ...totMarks,
                                                },
                                                total: calculateMarks(totMarks, competition),
                                            },
                                        },
                                    })
                                }
                            })
                        })
                        .then(() =>
                            idx === 0
                                ? alert('Poäng uppdaterade för samtliga ryttare')
                                : null,
                        )
                        .catch(() =>
                            alert(
                                idx === 0
                                    ? 'Woops! Det gick inte att sätta poäng för ryttarna. Försök igen!'
                                    : null,
                            ),
                        )
                })

                break
            case 'preliminary':
                firebase.db
                    .runTransaction(transaction => {
                        return transaction.get(riderDoc).then(doc => {
                            if (doc.exists) {
                                const totMarks = {
                                    ...initialMarks[doc.id],
                                    ...localMarks[doc.id],
                                }
                                transaction.update(riderDoc, {
                                    marks: {
                                        ...doc.data().marks,
                                        [judgeId]: {
                                            marks: {
                                                ...totMarks,
                                            },
                                            total: calculateMarks(totMarks, competition),
                                        },
                                    },
                                })
                            }
                        })
                    })
                    .then(() => alert(`Poäng uppdaterade för ryttare ${rider[0].rider}!`))
                    .catch(() =>
                        alert(
                            `Woops! Det gick inte att sätta poäng för ryttare ${
                                rider[0].rider
                            }. Försök igen!`,
                        ),
                    )

                break
            default:
        }
    }

0 个答案:

没有答案