如何向Firestore ListField的指定索引位置赋值
结论
直接使用FieldValue.arrayUnion无法实现给固定长度数组指定索引位写入值的需求。
原因说明
FieldValue.arrayUnion的唯一作用是向数组中追加不存在的元素,既不支持按索引定位修改、替换已有元素,也无法识别你要操作的具体索引位置。- 你的场景中数组固定为5个索引位、默认值全为
0,要修改指定位置的值,不能用数组成员追加类API实现。
正确实现方式
Firestore原生支持通过点语法+索引的方式直接更新数组指定位置的元素,不需要读取整个数组再回写,也不需要用数组操作API,代码示例如下:
FirebaseFirestore.instance .collection('Rooms') .doc(widget.roomId) .update({ // 按「字段名.索引位」的格式直接定位要修改的位置 'seetsList.2': 你需要写入的目标值 });
注意:该写法要求目标索引位在数组中真实存在,你的数组初始化时就固定有5个索引位,完全满足使用条件,不会触发索引不存在的报错。
如果你选择先读取文档拿到完整seetsList数组,修改索引2对应的值后再把整个数组回写的方案也是可行的,但这种方式需要额外一次读操作,高并发场景下还可能出现数据被其他请求覆盖的问题,优先推荐点语法直接更新的方案。
内容的提问来源于stack exchange,提问作者Mohammed Hamdan
相关产品推荐
相关产品推荐

