如何正确向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
相关产品推荐
相关产品推荐

