Firebase snap.ref.remove()正在删除父节点中的所有节点,而不仅仅是其自身
我只是想删除前两个节点,但它删除了整个分支。如果我注释掉remove(),它会正确地记录前2个节点,但当我取消注释remove()时,它会删除该消息ref中的所有节点,而不仅仅是前2个节点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
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();
});
});
虽然我通常不鼓励使用一次
和值
来获取项目列表,但这似乎是一个合理的用例