根据标准/子项删除所有数据的好方法';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()”吗?