根据标准/子项删除所有数据的好方法';Firebase数据库管理中的s值?
我想通过删除其所有具有根据标准/子项删除所有数据的好方法';Firebase数据库管理中的s值?,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我想通过删除其所有具有isTesting==true的子节点来清理此userPublic。我正在使用Firebase的云函数。我的做法是: const userPublic=admin.database().ref(“/userPublic”) const testsinserpublic=userPublic.orderByChild(“isTesting”).equalTo(true) testsinserPublic.once(“值”,dataSnapshot=>{ // ??? })
isTesting==true
的子节点来清理此userPublic
。我正在使用Firebase的云函数。我的做法是:
const userPublic=admin.database().ref(“/userPublic”)
const testsinserpublic=userPublic.orderByChild(“isTesting”).equalTo(true)
testsinserPublic.once(“值”,dataSnapshot=>{
// ???
})
.remove()
,而不能对快照调用,而是要筛选我希望它返回快照的子项,因此如何从快照中获取引用?(我想知道每个筛选子项的密钥XXX-XXX-XXX,这样我就可以将它们逐个连接到userPublic
和.remove()
中).remove()
然后等待承诺,然后调用下一个来逐个删除它们听起来不是一种最佳方式。有没有办法一次就把它们全部去掉userPublic
节点上的.update()
,我将必须获取所有内容,删除带有istest
的一个,然后将剩余内容放回更新。与过滤方式相比,这听起来似乎效率不高。最终,带有.istest
的数据只占所有数据的5%。或者这实际上是每个人都在使用的方法你快到了。剩下的就是根据查询结果创建单个多位置更新:
const userPublic = admin.database().ref("/userPublic")
const testsInUserPublic = userPublic.orderByChild("isTesting").equalTo(true)
testsInUserPublic.once("value", snapshot => {
var updates = {};
snapshot.forEach(function(child) {
updates["/userPublic/"+child.key] = null;
});
userPublic.update(updates);
})
通过承诺做到这一点不会有太大的不同:
testsInUserPublic.once("value", snapshot => {
var promises = [];
snapshot.forEach(function(child) {
promises.push(child.ref.remove());
});
Promise.all(promises); // this returns a promise that resolves once all deletes are done, or that rejects once one of them fails
})
这方面的性能将非常相似,因为Firebase通过单个连接将请求管道化。请参见ref变量已经位于“/userPublic”为什么我仍然需要在
updates
键中再次包含“/userPublic”?在中,它似乎是从引用的路径开始的。是的,但我不确定你的路径。需要认识到的重要一点是,您可以将整个路径放入密钥中,以便可以在任何级别进行更新。好。。另一个重要的事实是,将null
写入一个位置会删除该路径。:-)密钥中有完整的路径,不是userPublic.update(更新)
导致双重/userPublic/userPublic/XXX-XXX-XXX
,因为userPublic
已经位于/userPublic
?如果我使用整个路径,我不应该从根开始吗?我认为它从根开始,因为前面的/
。但是,您正处于验证这一点的最佳位置。“snapshot.ref.remove()”不是删除了整个“/userPublic”吗?!它不应该是“child.ref.remove()”吗?