根据Firebase数据库管理员中的条件/子项值删除所有数据的好方法?

时间:2017-08-08 10:54:55

标签: firebase firebase-realtime-database google-cloud-functions

enter image description here

我希望通过删除userPublic的所有子节点来清理此isTesting == true。我正在使用Firebase的云功能。我的方法是:

const userPublic = admin.database().ref("/userPublic")
const testsInUserPublic = userPublic.orderByChild("isTesting").equalTo(true)
testsInUserPublic.once("value", dataSnapshot => {
    // ???
})
  1. 由于我只能在引用而不是快照上调用.remove(),但为了过滤我想要的子项返回快照,如何从快照中获取引用? (我想知道每个已过滤的孩子的关键XXX-XXX-XXX,所以我可以逐个userPublic.remove()连接它们。

  2. 此外,即使我可以获取我要删除的所有引用,我想通过调用.remove()逐个删除它们然后等待promise,然后调用下一个不听起来像最佳方式。有没有办法一次性删除所有这些?

  3. 如果涉及在.update()节点上调用userPublic,我将需要获取所有内容,删除isTesting的内容,然后将其余内容返回更新。与过滤方式相比,这听起来效率不高。最终,.isTesting的那个只占所有数据的5%左右。或者这实际上是每个人都在使用的方法?

1 个答案:

答案 0 :(得分:2)

你快到了。剩下的就是根据查询结果创建一个多位置更新:

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);
})

使用promises执行此操作不会有太大的不同:

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会通过单个连接对请求进行管道传输。见http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786