web-dev-qa-db-fra.com

Méthode appropriée pour stocker des valeurs sous forme de tableau dans Firebase

J'ai un nom de chanson, avec les notes que je garde pour elle . Et cela ressemble à la photo ci-dessous, car j'utilise Push() pour enregistrer chaque nouvelle note.

data example

Mais ce que je voudrais voir, c'est ratings comme un tableau d'objets , Chacun contenant quelque chose comme:

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

Donc, la clé rating finira par ressembler à ceci:

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

Ensuite, je ne peux activer qu'un seul vote par adresse IP. Ce que je ne pouvais pas trouver dans Firebasedocs, c'est comment ajouter une clé existante, dans ce cas rating (mais ce serait [liste, comme]) - anew hash comme celle ci-dessus . Parce que Push() crée automatiquement la valeur hash-key, et je souhaite l’appliquer à une clé existante.

EDIT: Je suis conscient du fait , Firebase ne stocke pas les tableaux de manière native, mais dans ce cas, cela n’a pas d’importance, c’est comme ça que je voudrais voir mes données.

13
branquito

Vous utilisez actuellement Push pour ajouter de nouveaux enfants, ce qui génère automatiquement un nom pour le nouveau nœud qui est "garanti" d'être unique sur plusieurs clients. 

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

La méthode Push de Firebase est un excellent moyen de faire en sorte que plusieurs clients ajoutent des éléments à une collection ordonnée. Si vous voulez accomplir la même chose en utilisant des tableaux, vous devez synchroniser la longueur du tableau entre les clients. La génération de noms de Firebase ne nécessitant pas de tels frais généraux, elle est généralement préférable pour conserver une collection de commandes sur plusieurs clients.

Mais dans votre cas, vous ne semblez pas vouloir une collection ordonnée "uniquement". Il semble que vous considériez l'adresse IP comme une identification de chaque nœud. Dans ce cas, j'utiliserais l'adresse IP comme base du nom du nœud:

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

Vous accomplissez ceci avec:

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

Si vous voulez par la suite lire tous les votes dans un tableau, vous pouvez faire:

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');
})
14
Frank van Puffelen

Je voulais créer une fonction réutilisable pour ajouter/enregistrer n'importe quel objet sous un nœud racine (même s'il contient un tableau de données à n'importe quel niveau de l'objet) . Alors je suis venu avec cela. (Je ne sais pas si est conforme aux meilleures pratiques, mais cela a fonctionné sans encombre)

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

Donc, pour ajouter un nouvel utilisateur sous root users, vous appelez:

SaveWholeData("users", oUserInfo, true);

et pour mettre à jour l'utilisateur existant :

SaveWholeData("users"+"/"+ oUserInfo.genKey, oUserInfo, true);
0
Mahesh