Proper way to store values array-like in Firebase

arrays, firebase

Solution

You are currently using `push` to add new children, which automatically generates a name for the new node that is "guaranteed" to be unique across multiple clients.

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

Firebase's `push` method is a great way to have multiple clients adding items to an ordered collection. If you want to accomplish the same using arrays, you'd have to synchronize the length of the array between the clients. Firebase's name generation doesn't require such overhead, so is normally the preferred of keeping an order collection across multiple clients.

But in your case, you don't seem to want an ordered "append only" collection. It seems like you consider the IP address to be an identification of each node. In that case I would use the IP address as the basis for the node name:

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

You would accomplish this with:

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

If you want to subsequently read all votes into an array, you can do:

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

Problem

I have a name of the song, with ratings I am saving for it. And it looks like pic bellow, as I am using `push()` to store each new rating. But what I would like to see is, `ratings` as an array of objects, each containing something like this: ``` voter: { ip: "1.1.1.1", stars: 3, } ``` So `rating` key would end up being something like this: ``` rating: [{ip: "1.1.1.1", stars: 3}, ...] ``` Then I can enable only one vote per IP address. What I couldn't find in `Firebase` docs, is how to add to an existing key, in this case `rating`(but it would be [list, like]) - a new `hash` like the one above. Because `push()` automatically creates `hash-key` value, and I want to append to an existing key. EDIT: I am aware of the fact, that Firebase does not store arrays natively, however in this case it does not matter, it's just how I would like to see my data.

Original source