【问题标题】:Firebase - How to remove individual data from a node without removing entire nodeFirebase - 如何在不删除整个节点的情况下从节点中删除单个数据
【发布时间】:2017-02-07 14:10:57
【问题描述】:

我的数据库如下所示:

MYAPP
|_______________users
|                   |__OshwYF72Jhd9bUw56W7d
|                   |                   |
|                   |                   |__username
|                   |                   |__email            
|                   |                   |__blocklist             
|                   |                             |
|                   |                             |__I7Dbys9uHwbd3s4DFXo
|                   |                             |                |__blockedId:"KbHy4293dYgVtT9pdoW"
|                   |                             |                
|                   |                             |__J7c3en8rdILxJQSA9ij
|                   |                             |                |__blockedId:"Gicuwy8r23ndoijdakr"
|                   |                             |
|                   |                             |__JicbS32uf6sg28dJD2a
|                   |                             |__GidhwgcLNA8jshda2f4
|                   |
|                   |__KbHy4293dYgVtT9pdoW
|                   |__PS8tgw53SnO892Jhweh
|                   |__Gicuwy8r23ndoijdakr
|
|__conversations

我正在尝试找出正确的 Firebase 查询来删除 blocklist 中的单个节点而不删除其他节点。

例如,我想删除等于 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 的节点并将其删除,但它正在删除每个节点(因此删除进程中的 blocklist 节点)。

有没有办法只定位和删除 blocklist 节点中包含的单个值而不删除其中包含的所有内容?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    你几乎明白了。您的查询很好,但是当您对 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 对它们进行键控,并将值放入其他任何东西(例如 @987654322 @)。你仍然可以迭代它们,它们在安全规则中工作得更好,你可以直接使用firebase.database().ref('users/'+globaluid+'/blocklist').child(idToRemove).remove();删除它们
    猜你喜欢
    • 2021-05-10
    • 2023-04-03
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多