如何使用JavaScript在Firebase Realtime Database中按指定值删除父级key
问题原因说明
你写的代码存在两个核心问题导致删除失败:
- 不能直接对Firebase查询对象调用
remove()方法,Realtime Database的查询实例本身不支持直接删除操作,必须先执行查询拿到匹配的节点数据,再针对每个节点的引用执行删除 - 代码存在语法错误,
query.remove()后多了多余的闭合括号会导致执行异常,且异步操作没有加await,异常无法被catch捕获
正确实现代码
removeProductById = async (id, user) => { const userProductRef = db.ref(`products/product`); try{ // 执行查询获取匹配id的节点快照 const querySnapshot = await userProductRef.orderByChild('id').equalTo(id).get(); // 遍历所有匹配到的节点执行删除 querySnapshot.forEach(snapshot => { snapshot.ref.remove(); }) }catch(error){ console.log(`The error has occured ${error.message}`) } }
通用按字段值删除逻辑
不管你需要匹配什么字段的任意指定值,都可以按照这个逻辑实现删除:
- 构造你要查询的父节点引用
- 调用
orderByChild('要匹配的字段名')指定匹配字段,链式调用equalTo(要匹配的字段值)构造查询条件 - 执行查询拿到快照后遍历所有匹配节点,调用每个节点的
ref.remove()完成删除
注意事项
- 建议给你要查询的字段添加数据库索引,数据量较大时没有索引会触发报错,索引可以在Realtime Database的安全规则中配置,匹配id的示例规则如下:
{ "rules": { "products": { "product": { ".indexOn": "id" } } } }
- 如果确定同一个匹配值只会对应一个节点,遍历到第一个匹配项执行删除后可以直接
return true中断遍历,优化执行效率
内容的提问来源于stack exchange,提问作者newnick988888
相关产品推荐
相关产品推荐

