Get random item from Firebase

Viewed 19867

I searched for it, but all the answers are pretty old so maybe there is a better way. I'm trying to get a random item from a Firebase DB which looks like this:

enter image description here

I want to get a random user, that is all.

Any ideas?

4 Answers

I have been looking for the same function, now I guess it can be done with the new released Cloud Firestore, but I'm looking for a simple solution.

btw. the neat feature of limitToFirst + limitToLast does not work, at least not in javascript (web).

The best I can come up with (if the key index "time-random" is not enough) are:

If you only need the data random once (my situation, a deck of random cards):

add a value with Math.random() and orderByChild() on that number, remove keys or use startAt() with the last used key as parameter.

var ref = firebase.database().ref('companies/01/users').push();
var randomValue = Math.random();
ref.update({ ..., 'r': randomValue });

...

var ref = firebase.database().ref('companies/01/users')
ref.orderByChild('r').limitToFirst(1).once('value').then(function(snapshot) {
  var data = snapshot.val()
  ...
  snapshot.remove()
});

If the data should be used the get a random element many times a known index is needed.

a known numbered index can be added

var ref = firebase.database().ref('companies/01/users').push();
ref.update({ ..., 'r': '0001' });

...

var ref = firebase.database().ref('companies/01/users')
ref.orderByChild('r').limitToLast(1).once('value').then(function(snapshot) {
  var totalIndex = Object.values(snapshot.val())[0].r;
});
var randomValue = Math.floor(Math.random() * totalIndex);
ref.orderByChild('r').equalTo(randomValue).once('value').then(function(snapshot) {
  var data = snapshot.val()
});
Related