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
相关产品推荐
相关产品推荐

