Firestore中数组内对象votes字段递增的实现问题
解决Firestore数组对象中指定元素的votes递增问题
你的问题出在没搞清楚Firestore更新数组内特定元素的正确方式——直接替换数组或者用arrayUnion都不是针对已有元素修改的操作,得用**数组过滤器(array filters)**来定位目标元素再更新。
正确实现代码
首先确保导入FieldValue:
import { doc, updateDoc, FieldValue } from "firebase/firestore";
然后编写更新函数:
async function incrementTopicVote(id, topicName) { const docRef = doc(db, "questions", id); await updateDoc(docRef, // 指定要更新的路径:数组中匹配elem的元素的votes字段 { "topics.$[elem].votes": FieldValue.increment(1) }, // 设置数组过滤器:匹配title等于传入的topicName的元素 { arrayFilters: [{ "elem.title": topicName }] } ); }
为什么之前的写法不行
- 第一种写法直接把
topics字段赋值为单个对象,会覆盖整个数组,自然把原有两个元素都替换掉了。 - 第二种用
arrayUnion的作用是往数组里新增元素,而不是修改已有元素,所以会多出一个新对象。
注意事项
- 确保
topicName和数组中对象的title字段完全匹配(大小写、空格都要一致)。 - 数组中如果有多个
title相同的元素,这个操作会把所有匹配的元素的votes都加1,通常建议title在数组中保持唯一。
内容的提问来源于stack exchange,提问作者Rher
相关产品推荐
相关产品推荐

