2017-02-07 1 views
0

моя база данных выглядит следующим образом:Firebase - Как удалить отдельные данные из узла без удаления всего узла

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); 
        } 
     }); 
    });    

}; 

Я думал, что эта функция будет предназначенный только для узла, который содержит соответствующий идентификатор, и удаляет его, но вместо этого он удаляет каждый узел (и таким образом удаляет узел blocklist в процессе).

Есть ли способ нацеливать и удалять только индивидуальное значение, содержащееся внутри узла blocklist, без удаления всего содержащегося там?

ответ

2

Вы почти получили его. Ваш запрос прекрасен, но когда вы выполняете запрос к базе данных 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); 
      } 
     }); 
    }); 
}); 
+0

Это идеальный вариант, спасибо за объяснения и ответить еще раз Фрэнк! – Emily

+1

Чтобы добавить к ответу Пуфа: поскольку кажется, что фактические ключи в списке блокировок, вероятно, являются излишними, вы можете просто называть их заблокированными идентификаторами и поместить значение на что-нибудь еще (например, 'true'). Вы все еще можете их перебирать, они работают лучше в правилах безопасности, и вы можете удалить их напрямую, используя 'firebase.database(). Ref ('users /' + globaluid + '/ blocklist'). Child (idToRemove) .remove(); ' – Kato

Смежные вопросы