You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FirebaseFirestore事务更新失效:计数无法正常变更问题咨询

Firebase Firestore事务更新失效问题修复

问题根源分析

你的代码存在两个核心问题导致更新失效:

  • 更新路径错误:文档中的rank、count、timestamp字段实际嵌套在data字典下,但你的transaction.Update直接操作了根级字段,相当于创建了新的根级字段而非修改data下的目标字段。
  • 异步处理不规范:使用ContinueWith嵌套异步操作时,没有正确返回完成的任务,可能导致事务在未执行完更新逻辑就提前结束。

修正后的代码

FirebaseFirestore store = FirebaseFirestore.DefaultInstance;
CollectionReference globalRef = store.Collection("global");
DocumentReference doc = globalRef.Document("rank" + rankType);

await store.RunTransactionAsync(async (transaction) =>
{
    DocumentSnapshot snapshot = await transaction.GetSnapshotAsync(doc);
    if (snapshot.Exists)
    {
        // 直接从Snapshot获取嵌套字段,避免字典转换的繁琐和错误
        var dataDict = snapshot.GetValue<Dictionary<string, object>>("data");
        int rank = Convert.ToInt32(dataDict["rank"]);
        int count = Convert.ToInt32(dataDict["count"]);
        long t = Convert.ToInt64(dataDict["timestamp"]);

        if (count >= 200 && timestamp > t)
        {
            // 使用点路径更新嵌套字段
            transaction.Update(doc, 
                "data.rank", rank + 1,
                "data.count", 0,
                "data.timestamp", timestamp + 3600);
        }
        else
        {
            transaction.Update(doc, "data.count", count + 1);
        }
    }
});

关键修正点说明

  • 嵌套字段路径:Firestore支持用.表示嵌套字段路径,比如data.count对应文档中data字典下的count字段,确保更新到正确的位置。
  • 异步操作优化:改用async/await替代ContinueWith,让事务逻辑的异步流程更清晰,保证更新操作在事务提交前执行完成。
  • 字段获取方式优化:直接通过snapshot.GetValue<T>获取嵌套字典,比手动转换ToDictionary更简洁且降低类型转换错误风险。

内容的提问来源于stack exchange,提问作者tfalse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:52:37