如何在配置indexOn的Firebase Realtime Database中删除过滤后的子节点
解决方案
第一步:配置数据库索引
首先在Firebase Realtime Database的规则配置中添加对应字段的索引,确保查询可以正确执行,索引配置参考如下:
{ "rules": { "Foreign": { "$userId": { "Category": { "Cat01": { ".indexOn": ["uid", "expireDate"] } } } } } }
将上述配置中的expireDate替换为你实际存储日期的字段名即可。
第二步:正确的过滤删除代码
你需要先按uid过滤节点,再判断日期是否过期,再执行删除,参考代码如下:
deleteData: function (req, callback, res) { let userId = req.User; const db = firebase.database() // 当前时间戳,如果你存的是ISO日期字符串可自行调整对比逻辑 const currentTime = Date.now() let catRef = db.ref("Foreign/").child(userId).child("Category").child("Cat01") catRef // 必须先指定排序字段才能使用equalTo过滤 .orderByChild("uid") .equalTo("u001") .once("value") .then(function (snapshot) { const deleteTasks = [] snapshot.forEach((childNode) => { // 替换expireDate为你实际的日期字段名 const nodeExpireTime = childNode.val().expireDate // 判定是否过期 if (nodeExpireTime < currentTime) { deleteTasks.push(childNode.ref.remove()) } }) return Promise.all(deleteTasks) }) .then(() => { console.log("符合条件的节点删除完成") // 此处可添加你的回调逻辑 }) .catch(function(error) { console.log("删除失败: ",error) }); }
如果你的日期字段存储的是ISO格式字符串,将过期判断逻辑改为new Date(nodeExpireTime).getTime() < currentTime即可。
之前代码的错误原因
- 第一次尝试的代码:没有调用
orderByChild()就直接使用equalTo(),查询逻辑不成立,返回的查询结果为空,所以没有执行删除操作,同时代码中的uid变量未定义赋值。 - 第二次尝试的代码:直接对Cat01的根节点引用调用
remove(),自然会删除整个Cat01下的所有内容。
内容的提问来源于stack exchange,提问作者KUL
相关产品推荐
相关产品推荐

