2017-02-07 1 views
0

meiner Datenbank sieht wie folgt aus:Firebase - Wie einzelne Daten von einem Knoten zu entfernen, ohne gesamten Knoten entfernen

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

Ich versuche, die richtige Firebase Abfrage, um herauszufinden, einen einzelnen Knoten innerhalb blocklist zu entfernen, ohne das Löschen die anderen Knoten.

Zum Beispiel möchte ich den Knoten löschen, die blockedId:"KbHy4293dYgVtT9pdoW" gleich aber halten die anderen innerhalb "users/"+globaluid+"/blocklist" enthaltenen Knoten

Dies ist der Code, den ich zur Zeit bin mit:

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

}; 

Ich dachte, diese Funktion würde Zielen Sie nur auf den Knoten, der die übereinstimmende ID enthält, und entfernen Sie ihn, aber stattdessen wird jeder Knoten entfernt (und der Knoten blocklist wird dabei gelöscht).

Gibt es eine Möglichkeit, nur den einzelnen Wert innerhalb des Knotens blocklist zu targetieren und zu entfernen, ohne alle enthaltenen Komponenten zu entfernen?

Antwort

2

Sie haben es fast geschafft. Ihre Abfrage ist in Ordnung, aber wenn Sie eine Abfrage für die Firebase-Datenbank ausführen, werden möglicherweise mehrere Ergebnisse angezeigt. Der Snapshot enthält also eine Liste dieser Ergebnisse. Selbst wenn nur ein Ergebnis vorhanden ist, enthält der Snapshot eine Liste mit einem Ergebnis.

Sie müssen also über diese Ergebnisse in der Rückruf-Schleife:

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

Das ist perfekt, vielen Dank für Erklärung und Antwort wieder Frank! – Emily

+1

Um an Puf's Antwort anzufügen: Da es scheint, dass die tatsächlichen Schlüssel in der Blockliste wahrscheinlich überflüssig sind, könnten Sie sie einfach durch die blockierten IDs eingeben und den Wert auf etwas anderes setzen (z.B. 'true'). Sie können sie immer noch iterieren, sie funktionieren besser in Sicherheitsregeln und Sie können sie direkt mit 'firebase.database() löschen. Ref ('users /' + globaluid + '/ blocklist'). Child (idToRemove) .remove(); ' – Kato