2014-11-25 4 views
12

Ich habe einen Namen des Songs, mit Bewertungen, die ich für es speichern. Und es sieht aus wie pic unten, wie ich push() verwende, um jede neue Bewertung zu speichern.Ordnungsgemäße Art, Werte in Firebase Array-ähnlich zu speichern

data example

Aber was würde ich sehen möchte, ist, ratings als ein Array von Objekten, die jeweils etwa so:

voter: { 
    ip: "1.1.1.1", 
    stars: 3, 
} 

So rating Schlüssel würden am Ende so etwas wie dies zu sein:

rating: [{ip: "1.1.1.1", stars: 3}, ...] 

Dann kann ich nur eine Stimme pro IP-Adresse aktivieren. Was ich in Firebase Dokumenten nicht finden konnte, ist, wie man zu einem vorhandenen Schlüssel hinzufügt, in diesem Fall rating (aber es wäre [Liste, wie]) - eine neue hash wie die obige. Weil push() automatisch hash-key Wert erstellt, und ich möchte an einen vorhandenen Schlüssel anhängen.

EDIT: Ich bin mir der Tatsache, dass Firebase-Arrays nicht nativ speichern, aber in diesem Fall spielt es keine Rolle, es ist nur, wie ich möchte meine Daten sehen.

Antwort

14

Sie verwenden derzeit push, um neue untergeordnete Elemente hinzuzufügen, wodurch automatisch ein Name für den neuen Knoten generiert wird, der "garantiert" eindeutig für mehrere Clients ist.

ref.push({ ip: userIP, stars: userStars }); 

Firebase der push Methode ist eine gute Möglichkeit, mehrere Clients Hinzufügen von Elementen zu einer geordneten Sammlung zu haben. Wenn Sie dasselbe mit Arrays erreichen möchten, müssen Sie die Länge des Arrays zwischen den Clients synchronisieren. Die Namensgenerierung von Firebase erfordert keinen solchen Overhead. Daher wird normalerweise bevorzugt, eine Auftragssammlung über mehrere Clients hinweg zu verwalten.

Aber in Ihrem Fall scheinen Sie nicht eine geordnete "nur anfügen" Sammlung wollen. Es scheint, dass Sie die IP-Adresse als eine Identifikation jedes Knotens betrachten. In diesem Fall würde ich die IP-Adresse als Grundlage für die Knotennamen verwenden:

votes 
    "1.1.1.1": 3 
    "1.2.3.4": 5 
    "1.7.4.7": 2 

würden Sie erreichen dies mit:

ref.child(userIP).set(userStars); 

Wenn Sie anschließend wollen alle Stimmen in ein Array lesen Sie tun kann:

var votes = []; 
votesRef.on('value', function(snapshot) { 
    snapshot.forEach(function(vote) { 
     votes.push({ ip: vote.key(), stars: vote.val() }); 
    }); 
    alert('There are '+votes.length+' votes'); 
}) 
+0

Vielen Dank! Ich habe das gleiche Problem, das hat für mich funktioniert. – KaoriYui

0

I eine wiederverwendbare Funktion hinzuzufügen/zu speichern, jedes Objekt unter einem Wurzelknoten (auch wenn die eine Anordnung von Daten auf einem beliebigen Ebene innerhalb des Objekts) erzeugen wollte. Also habe ich das erfunden.(Ich bin nicht sicher, ob entspricht den besten Praktiken, aber es funktionierte ziemlich glatt)

SaveWholeData: function(sKey, oVal, bGenKey) { 
     bGenKey = bGenKey === undefined ? true: bGenKey; 
     var oOriginalProperty = angular.copy(oVal); 
     for (var property in oVal) { 
      if (oVal.hasOwnProperty(property) && oVal[property] instanceof Array) { 
       console.log(property); 
       oVal[property] = "$|$"; 
      } 
     } 
     var sOwnRef = SaveDataByKey(sKey, oVal, bGenKey); 
     for (var property in oVal) { 
      if (oVal.hasOwnProperty(property) && oVal[property] === "$|$") { 
       oVal[property] = oOriginalProperty[property]; 
       var updatedReference = sOwnRef + "/" + property; 
       SaveWholeData(updatedReference, oVal[property], false); 
      } 
     } 
     return true; 
    }, 
    SaveDataByKey: function(sKey, oVal, bGenKey) { 
     if (bGenKey) { 
      var newPostKey = firebase.database().ref(sKey).push().key; 
      oVal.genKey = newPostKey; 
      firebase.database().ref(sKey).child(newPostKey).set(oVal); 
      return sKey + "/" + newPostKey; 
     }else{ 
      firebase.database().ref(sKey).set(oVal); 
      return sKey; 
     } 
    } 

So zu neuen Benutzer unter root hinzufügen users, rufen Sie:

SaveWholeData("users", oUserInfo, true); 

und Update vorhandener Benutzer:

SaveWholeData("users"+"/"+ oUserInfo.genKey, oUserInfo, true); 
Verwandte Themen