【问题标题】:How to delete parent key by its value in firebase using javascript如何使用javascript通过其在firebase中的值删除父键
【发布时间】:2021-09-21 21:26:32
【问题描述】:
所以我是使用 firebase 实时数据库的新手,我无法删除指定 id 的产品密钥子项。
我尝试过这种方法,但没有成功:
removeProductById = async (id, user) => {
const userProductRef = db.ref(`products/product`);
try{
var query = userProductRef.orderByChild('id').equalTo(id);
query.remove()
})
}catch(error){
console.log(`The error has occured ${error.message}`)
}
}
所以我想知道如何通过他们指定的任何值删除任何密钥提示。提前谢谢你们,你们一直帮助我。
【问题讨论】:
标签:
javascript
firebase
firebase-realtime-database
【解决方案1】:
这里有两个问题:
- 您的查询与您要删除的节点不匹配。
- Firebase 不支持删除查询。
您的查询与您要删除的节点不匹配
您的查询从您的数据库中不存在的节点 products/product 开始,然后对每个子节点的 id 属性进行排序/过滤。
您想要的是从products 节点开始,然后对每个子节点的product/id 属性进行排序/过滤:
在代码中:
const userProductRef = db.ref(`products`);
var query = userProductRef.orderByChild('product/id').equalTo(id);
不要忘记,您需要在规则中的 products 级别为此定义 product/id 的索引。
Firebase 不支持删除查询
您不能简单地将查询和删除指令传递给 Firebase。要在数据库中写入节点,您需要知道该节点的完整路径。
所以你需要:
- 执行查询。
- 在您的应用程序代码中循环遍历结果。
- 单独或在多路径更新中删除每个匹配节点。
有了上面的query,那就是:
query.once("value").then((snapshot) => {
snapshot.forEach((child) => {
child.ref.remove();
});
})
或者使用多路径/批量更新:
query.once("value").then((snapshot) => {
let updates = {};
snapshot.forEach((child) => {
updates[child.key] = null;
});
ref.update(updates);
})