Ron Royston Ron Royston - 4 months ago 34
Javascript Question

Firebase v3 Query by Grandchild

When registering new email/password type users, I need to make user that the

displayName
that they enter does not already exist in my Realtime Database before calling
.createUserWithEmailAndPassword
. So I need a query. I need to get a list of all
displayName
's in my
users
branch. I am confused as to how to gather this for each
user
which is denoted by each users auth.uid.

What would the retrieval look like? I am thinking something like:

firebase.database().ref('users/' + allUserIds).equalTo('Joe');


but I know that
allUserIds
is not valid. Can someone help me with this?

{
"users" : {
"6mJb9vtpbDelyyjirKEf6sSEj8h1" : {
"name" : "asdfs@asdf.com",
"provider" : "password",
"displayName" : "Joe"
},
"T7D7qEOPPHXjKSzglKheGJDQNkE3" : {
"name" : "gfdsdf@hlkjh.com",
"provider" : "password",
"displayName" : "Jane"
},
"kTG9R0V4aXYsogQfgF633KFYtzV2" : {
"name" : "Andre3000",
"provider" : "google.com",
"displayName" : "Andre"
}
}
}

Answer

You'd use Firebase queries for that:

var users = firebase.database().ref('users');
var joes = users.orderByChild('displayName').equalTo('Joe');
joes.once('value', function(snapshot) {
  console.log('A Joe does '+(snapshot.exists()?'':'not ')+' exist')
});

Don't forget to define an index on users:

{
  "rules": {
    "users": {
      ".indexOn": "displayName"
    }
  }
}