Javascript 从Firebase实时数据库中删除数据将删除父节点中的所有数据

Javascript 从Firebase实时数据库中删除数据将删除父节点中的所有数据,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在使用Firebase并编写代码从实时数据库中删除数据。 我试图做的是在单击按钮时从用户的书签部分删除保存的帖子,下面是代码的关键部分: let user=firebase.auth().currentUser; var ref1=firebase.database().ref('saved/'+user.uid+'/posts/').orderByChild('postnum').equalTo(j); //j is the postnum of the post to be delete

我正在使用Firebase并编写代码从实时数据库中删除数据。 我试图做的是在单击按钮时从用户的书签部分删除保存的帖子,下面是代码的关键部分:

let user=firebase.auth().currentUser;
var ref1=firebase.database().ref('saved/'+user.uid+'/posts/').orderByChild('postnum').equalTo(j); //j is the postnum of the post to be deleted
ref1.once('value',function(snapshot){
    snapshot.ref.remove();
});
代码将清除用户以前保存的所有帖子,而不是删除关于特定帖子的信息。(即,这将清除“saved/user.uid/posts/”目录中的所有数据


我做错了什么?

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表

因此,
snapshot
变量包含一个结果列表。
snapshot.ref
指的是运行查询的位置。因此,当您执行
snapshot.ref.delete()
时,您删除的是运行查询的整个位置,而不仅仅是结果

要删除结果,请循环快照的子项,然后逐个删除它们:

let user=firebase.auth().currentUser;
var ref1=firebase.database().ref('saved/'+user.uid+'/posts/').orderByChild('postnum').equalTo(j); //j is the postnum of the post to be deleted
ref1.once('value',function(snapshot){
  snapshot.forEach(function(child) {
    child.ref.remove();
  });
});
您还可以使用多位置更新在循环后一次性删除它们:

let user=firebase.auth().currentUser;
var ref1=firebase.database().ref('saved/'+user.uid+'/posts/').orderByChild('postnum').equalTo(j); //j is the postnum of the post to be deleted
ref1.once('value',function(snapshot){
  let updates = [];
  snapshot.forEach(function(child) {
    updates[child.key] = null;
  });
  ref1.update(updates);
});


非常感谢!我应用了第一个代码,它工作得非常好。:)