Firestore的ArrayUnion能否操作map数组?仅单条写入是delete导致的吗
这个问题与delete操作无关,是arrayUnion处理数组元素时的固有特性导致的。
Firestore的arrayUnion原生自带去重逻辑,对数组中Object(map)类型元素的去重判断标准为:对象内所有键值对完全一致则判定为重复值,和对象的内存引用无关。你示例中messages.in[some_user_id]下的两条消息所有字段完全相同,传入arrayUnion后会被判定为同一个值,最终只会保留一份,也就出现了“只有单条消息转移成功”的现象。
两种解决方案
- 若业务需要保留完全重复的消息:放弃使用
arrayUnion,先读取目标数组现有内容,手动拼接后整体更新,示例如下:
const docSnapshot = await docRef.get(); const existOutMessages = docSnapshot.data().messages.out[some_user_id] ?? []; await docRef.update({ // 用字段路径写法避免覆盖其他用户数据 [`messages.out.${some_user_id}`]: [...existOutMessages, ...messages.in[some_user_id]], [`messages.in.${some_user_id}`]: admin.firestore.FieldValue.delete() });
- 若允许给消息加唯一标识:给每条消息新增独立id字段(比如uuid、时间戳串),保证即使内容相同的消息id也不重复,即可正常使用
arrayUnion完成合并。
注意:你原写法中嵌套更新的写法如果配置不当可能会覆盖
messages.in/messages.out下其他用户的数组数据,推荐使用上述示例的字段路径写法更稳妥。
内容的提问来源于stack exchange,提问作者Steve C
相关产品推荐
相关产品推荐

