我希望通过删除userPublic
的所有子节点来清理此isTesting == true
。我正在使用Firebase的云功能。我的方法是:
const userPublic = admin.database().ref("/userPublic")
const testsInUserPublic = userPublic.orderByChild("isTesting").equalTo(true)
testsInUserPublic.once("value", dataSnapshot => {
// ???
})
由于我只能在引用而不是快照上调用.remove()
,但为了过滤我想要的子项返回快照,如何从快照中获取引用? (我想知道每个已过滤的孩子的关键XXX-XXX-XXX,所以我可以逐个userPublic
和.remove()
连接它们。
此外,即使我可以获取我要删除的所有引用,我想通过调用.remove()
逐个删除它们然后等待promise,然后调用下一个不听起来像最佳方式。有没有办法一次性删除所有这些?
如果涉及在.update()
节点上调用userPublic
,我将需要获取所有内容,删除isTesting
的内容,然后将其余内容返回更新。与过滤方式相比,这听起来效率不高。最终,.isTesting
的那个只占所有数据的5%左右。或者这实际上是每个人都在使用的方法?
答案 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