Ronnie Smith
Ronnie Smith

Reputation: 18555

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" : "[email protected]",
      "provider" : "password",
      "displayName" : "Joe"
    },
    "T7D7qEOPPHXjKSzglKheGJDQNkE3" : {
      "name" : "[email protected]",
      "provider" : "password",
      "displayName" : "Jane"
    },
    "kTG9R0V4aXYsogQfgF633KFYtzV2" : {
      "name" : "Andre3000",
      "provider" : "google.com",
      "displayName" : "Andre"
    }
  }
}

Upvotes: 2

Views: 2830

Answers (2)

Ronnie Smith
Ronnie Smith

Reputation: 18555

Just thought I'd share my somewhat fleshed out solution. Call with myApp.displayNameExists('Joe').

var myApp = (function() {
    var pub = {};
    pub.displayNameExists = function(name) {
            var users = firebase.database().ref('users');
            var duplicate = users.orderByChild('displayName').equalTo(name);
            duplicate.once('value').then(function(snap) {
                if (snap.val()) {
                    console.log('found. ask for new display name');
                } else {
                    console.log('name unique.  ok to write this user to db');
                }
            }, function(error) {
                // The Promise was rejected.
                console.error(error);
            });
        }
        //API
    return pub;
}());

Upvotes: 0

Frank van Puffelen
Frank van Puffelen

Reputation: 598728

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

Upvotes: 3

Related Questions