Cloud Firestore 中如何引用未知名称的嵌套数组删除指定元素
结构订正
你示例中写的contacts用数组包裹带字符串键的子项不符合Firestore存储规范,实际你存储的contacts应该是映射(对象)类型,键为对应用户UUID,值为存储关联内容的数组。
解决方法
你可以通过两种方式构造动态字段路径,实现对UUID对应数组的操作:
方式1:使用ES6+ 计算属性名(最常用)
把动态的UUID拼接成完整的字段路径,用计算属性语法作为update的对象键即可,示例代码:
// 你从业务上下文拿到的动态UserAid,存在该变量中 const targetContactUserId = "动态获取的UserAid UUID值"; const toBeRemovedValue = "value2"; firebase.firestore().collection('Users') .doc(user.id) .update({ [`contacts.${targetContactUserId}`]: firebase.firestore.FieldValue.arrayRemove(toBeRemovedValue) })
方式2:使用FieldPath构造路径(兼容旧JS环境)
如果你的运行环境不支持计算属性语法,可以用Firestore内置的FieldPath类构造动态路径:
const targetContactUserId = "动态获取的UserAid UUID值"; const toBeRemovedValue = "value2"; // 构造动态字段路径 const targetField = new firebase.firestore.FieldPath('contacts', targetContactUserId); firebase.firestore().collection('Users') .doc(user.id) .update(targetField, firebase.firestore.FieldValue.arrayRemove(toBeRemovedValue))
注意事项
- 操作前请确认
contacts下对应UUID的字段确实是数组类型,否则arrayRemove会抛出类型错误 - 如果对应UUID的数组不存在,该update操作不会产生任何额外副作用,不会生成冗余字段
内容的提问来源于stack exchange,提问作者Daniel Corona
相关产品推荐
相关产品推荐

