Firebase snap.ref.remove()正在删除父节点中的所有节点,而不仅仅是其自身

Firebase snap.ref.remove()正在删除父节点中的所有节点,而不仅仅是其自身,firebase,Firebase,我只是想删除前两个节点,但它删除了整个分支。如果我注释掉remove(),它会正确地记录前2个节点,但当我取消注释remove()时,它会删除该消息ref中的所有节点,而不仅仅是前2个节点 messagesRef.limitToFirst(2).on('child_added', function (snap) { snap.ref().remove(); console.log(snap.val()); }); 您可以检查messagesRef和messagesRef.li

我只是想删除前两个节点,但它删除了整个分支。如果我注释掉remove(),它会正确地记录前2个节点,但当我取消注释remove()时,它会删除该消息ref中的所有节点,而不仅仅是前2个节点

messagesRef.limitToFirst(2).on('child_added', function (snap) {
    snap.ref().remove();
    console.log(snap.val());

});

您可以检查messagesRef和messagesRef.limitToFirst(2.ref())以查看相同的路径

当您尝试以下操作时会发生什么

messagesRef.limitToFirst(2).on('child_added', function (snap) {
    console.log(snap.val());
    snap.forEach(function(data) {
        console.log("The message key :" + data.key() );
        messagesRef.child(data.key()).remove();
    });
});

这是因为一旦你删除了一个,现在有一个“新”的子_添加到2的限制中。所以它会不断地循环它们,直到它们全部被删除

Child 1
Child 2

->>delete child 1

Child 2
Child 3 ->new child_added event

etc...
要避开这个问题,您可以保留一个计数器:

var numRemoved = 0; 
var ref = messagesRef.limitToFirst(2);
ref.on('child_added', removeFirstTwoChildren);
removeFirstTwoChildren(snap){
    snap.ref().remove();
    console.log(snap.val());
    numRemoved++;
    if(numRemoved === 2){
        ref.off('child_added', removeFirstTwoChildren);
    }
}

@马修伯格的答案将非常有效。如果您只想删除少数用户,另一种选择是:

var ref = messagesRef.limitToFirst(2);
ref.once('value', function(twovaluesnapshot) {
  twovaluesnapshot.forEach(function(snapshot) {
    snapshot.remove();
  });
});
虽然我通常不鼓励使用
一次
来获取项目列表,但这似乎是一个合理的用例