2016-07-21 4 views
1

При регистрации новых пользователей типа электронной почты/паролей мне нужно сделать, чтобы введенный вами displayName не существует в моей базе данных реального времени, прежде чем звонить .createUserWithEmailAndPassword. Поэтому мне нужен запрос. Мне нужно получить список всех displayName в моей ветке users. Я смущен относительно того, как собрать это для каждого user, который обозначается каждым пользователем auth.uid.Firebase v3 Query by Grandchild

Как выглядит поиск? Я имею в виду что-то вроде:

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

, но я знаю, что allUserIds не действует. Может кто-то помочь мне с этим?

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

ответ

2

Вы бы использовать Firebase запросы для этого:

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

Не забудьте определить индекс users:

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

Вы запускаете запрос в коллекции, но заказываете/фильтруете свойство отдельных элементов. Это действительно всегда немного сбивает с толку. Напомню, не забудьте поставить '.indexOn' на правильный уровень. Я добавил пример. –

+0

В моем коде нет операторов 'return', поэтому я не уверен, что вы имеете в виду. Если у вас возникли проблемы с его работой, можете ли вы настроить jsfiddle/jsbin, который воспроизводит эту проблему? –

+1

Это особое усилие не требуется. '.updateProfile' хранит свойства' displayName' и 'photoURL' в системе Firebase Auth. Поэтому нет необходимости устанавливать/получать этот материал под узлом пользователя в вашей базе данных реального времени. –

0

Просто думал, что я разделю мой несколько конкретизированы . Позвоните по номеру 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; 
}());