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

如何正确向Firestore追加Map数组?为何出现额外索引0?

问题原因与解决方案

问题原因

你用了FieldValue.arrayUnion([attended_topic]),这个方法是用来给数组字段添加元素的,所以Firestore会把attended_topic这个Map当作数组的一个元素存入,自动生成数组索引(也就是你看到的0)。但你的预期是attended_topic是一个Map结构(键为topicId,值为对应的属性对象),两者类型不匹配,这就是出现额外层级的原因。

正确实现代码

既然attended_topic是Map类型,直接用Firestore的嵌套更新语法即可,不需要用到数组相关的方法。修改后的代码如下:

Map<String, Object> prop = {
  'read': true,
  'vote_left': false,
  'vote_right': false,
};

// 构造嵌套更新的键值对,用点语法指定Map下的子字段
Map<String, Object> updateData = {
  'attended_topic.$received_id': prop
};

FirebaseFirestore.instance.collection('userinfo').doc(user_now!.uid)
    .update(updateData);

这样执行后,attended_topic下会直接生成以received_id为键的属性对象,和你预期的结构完全一致。

补充说明

  • 你选择update()而非set()是完全正确的,它只会修改指定的嵌套字段,不会覆盖文档中已有的其他属性。
  • 如果attended_topic字段之前不存在,update()会自动创建这个Map字段,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:27:23