Javascript Firebase-如何在不删除整个节点的情况下从节点中删除单个数据

Javascript Firebase-如何在不删除整个节点的情况下从节点中删除单个数据,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我的数据库如下所示: MYAPP |_______________users | |__OshwYF72Jhd9bUw56W7d | | | | | |__username | | |__email |

我的数据库如下所示:

MYAPP
|_______________users
|                   |__OshwYF72Jhd9bUw56W7d
|                   |                   |
|                   |                   |__username
|                   |                   |__email            
|                   |                   |__blocklist             
|                   |                             |
|                   |                             |__I7Dbys9uHwbd3s4DFXo
|                   |                             |                |__blockedId:"KbHy4293dYgVtT9pdoW"
|                   |                             |                
|                   |                             |__J7c3en8rdILxJQSA9ij
|                   |                             |                |__blockedId:"Gicuwy8r23ndoijdakr"
|                   |                             |
|                   |                             |__JicbS32uf6sg28dJD2a
|                   |                             |__GidhwgcLNA8jshda2f4
|                   |
|                   |__KbHy4293dYgVtT9pdoW
|                   |__PS8tgw53SnO892Jhweh
|                   |__Gicuwy8r23ndoijdakr
|
|__conversations
我正在尝试找出正确的Firebase查询,以便在不删除其他节点的情况下删除
块列表中的单个节点

例如,我想删除等于
blockedId的节点:“KbHy4293dYgVtT9pdoW”
,但保留
“users/”+globaluid+“/blocklist”中包含的其他节点

这是我当前使用的代码:

function unblockUser(){

    // friendToUnblock is the ID I want to remove from the block list:
    var friendToUnblock = document.getElementById('hiddenUid').innerHTML;

    // globaluid is the currently logged in user's ID:
    var blockedRef = firebase.database().ref('users/'+globaluid+'/blocklist/');

    var blockedQuery = blockedRef.orderByChild('blockedId').equalTo(friendToUnblock);

        blockedQuery.once('value').then(function(blockedSnapshot) {
            blockedSnapshot.ref.remove(function (error) {

                if (!error) {
                    console.log(friendToUnblock+" should now be unblocked.");
                    }else{
                        console.log("There's been an error unblocking the user: "+error);
                    }
        });
   });              

};
我原以为这个函数只针对包含匹配ID的节点并将其删除,但实际上它正在删除每个节点(因此在这个过程中删除
块列表
节点)


有没有一种方法可以只针对并删除
块列表
节点中包含的单个值,而不删除其中包含的所有内容?

您几乎可以做到这一点。您的查询很好,但是当您对Firebase数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果列表

因此,您需要在回调中循环这些结果:

blockedQuery.once('value').then(function(blockedSnapshot) {
    blockedSnapshot.forEach(function(childSnapshot) {  
        childSnapshot.ref.remove(function (error) {
            if (!error) {
                console.log(friendToUnblock+" should now be unblocked.");
            }else{
                console.log("There's been an error unblocking the user: "+error);
            }
        });
    });
});

你差点就成功了。您的查询很好,但是当您对Firebase数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果列表

因此,您需要在回调中循环这些结果:

blockedQuery.once('value').then(function(blockedSnapshot) {
    blockedSnapshot.forEach(function(childSnapshot) {  
        childSnapshot.ref.remove(function (error) {
            if (!error) {
                console.log(friendToUnblock+" should now be unblocked.");
            }else{
                console.log("There's been an error unblocking the user: "+error);
            }
        });
    });
});

这是完美的,谢谢你的解释和回答再次坦率!附加到Puf的答案上:由于区块列表中的实际键似乎是多余的,因此您可以简单地通过被阻止的ID对它们进行键控,并将该值添加到任何其他值(例如
true
)。您仍然可以迭代它们,它们在安全规则中工作得更好,您可以直接使用
firebase.database().ref('users/'+globaluid+/blocklist').child(idToRemove).remove()删除它们这是完美的,感谢您的解释和再次回答弗兰克!附加到Puf的答案上:由于区块列表中的实际键似乎是多余的,因此您可以简单地通过被阻止的ID对它们进行键控,并将该值添加到任何其他值(例如
true
)。您仍然可以迭代它们,它们在安全规则中工作得更好,您可以直接使用
firebase.database().ref('users/'+globaluid+/blocklist').child(idToRemove).remove()删除它们