2015-08-22 6 views
1

Я новичок в Firebase. У меня проблема при выполнении запроса:где запрос в firebase

new Firebase("https://blazing-fire-2739.firebaseio.com/users") 
     .startAt($scope.user.email) //[email protected] 
     .endAt($scope.user.email) 
     .once('value', function(snap) { 
      console.log('accounts matching email address', snap.val()) 
     }); 

Это показывает мне null.

В Firebase:

users 
    -JxFNEu31LJ0Efy8PnX5 
     email: [email protected] 
     firstname:karan 
     lastname: sofat 

Пожалуйста, помогите

+0

Попробуйте положить заказBychild ('email') перед этим. Кроме того, equalTo() FTW. – Kato

ответ

0

.startAt и endAt не принимает строку, оно принимает ряд, где начало/конец в. Таким образом, вы должны изменить к

new Firebase("https://blazing-fire-2739.firebaseio.com/users") 
    .startAt(1) 
    .endAt(50) 
    .once('value', function(snap) { 
    console.log('accounts matching email address', snap.val()); 
}); 

Или просто оставить из endAt() в целом.

+0

Важно отметить, что это не будет работать, если пользовательские объекты не будут установлены с приоритетом. Этот [ответ] (http://stackoverflow.com/a/24102307/1526037) показывает правила упорядочения. Вам понадобится ['.setPriority()'] (https://www.firebase.com/docs/web/api/firebase/setpriority.html) или ['.setWithPriority()'] (https: // www. firebase.com/docs/web/api/firebase/setwithpriority.html) –

+0

Вы можете видеть, что это не работает в [this plnkr] (http://plnkr.co/edit/oTIqlEwzovH8da2soVqN?p=preview) –

2

В документаций для Query.startAt() и Query.endAt(), под заголовком «Аргументы», вы увидите, что первый аргумент, value, является:

Значение начать [или конец] в. Тип аргумента зависит от того, какая функция orderBy*() была использована в этом запросе. Укажите значение, соответствующее типу orderBy*(). При использовании в сочетании с orderByKey() значение должно быть строкой.

Querying Data section of the Web Guide говорит,

С Firebase запросов к базе данных, мы можем выборочно извлекать данные, основанные на различных факторах. Чтобы построить запрос в вашей базе данных, вы начинаете с указания того, как вы хотите, чтобы ваши данные заказывались с использованием одной из функций заказа: orderByChild(), orderByKey(), orderByValue(), или orderByPriority(). Затем вы можете объединить их с пятью другими методами для выполнения сложных запросов: limitToFirst(), limitToLast(), startAt(), endAt() и equalTo().

  • Если пользовательские объекты имеют приоритет, и OrderBy не указано для Query, запрос будет сортировать по приоритетам и startAt/EnDAT индексами будет работать. Вы можете использовать .setPriority() или .setWithPriority().
  • Если пользовательские объекты не имеют приоритета, а Query не имеет orderBy*(), snapshot.val() будет иметь значение null.

Для вашего запроса, если пользовательские объекты не имеют приоритеты, установленные, сортировка по email ребенка составит startAt/endAt работу, например, так:

new Firebase("https://blazing-fire-2739.firebaseio.com/users") 
    .orderByChild('email') 
    .startAt($scope.user.email) 
    .endAt($scope.user.email) 
    .once('value', function(snap) { 
     console.log('accounts matching email address', snap.val()) 
    }); 

Вот это работает plnkr example этого запроса ,


Однако, как Като отметил в комментариях,

«В качестве общей рекомендации, orderByChild() вытесняет приоритеты и следует отдавать предпочтение. Приоритеты в конечном итоге будут прекращены в пользу дочерних полей «.

Поскольку ваша цель состоит в том, чтобы найти одного конкретного пользователя ее адрес электронной почты и так должен быть только один пользователь с данной email стоимости ребенка, вы можете,

  • Заказать Query объект для /users с помощью дочернего ключа "email";
  • Запрос для объекта пользователя, для которого email является equalTo(<email>).

Например:

var usersRef = new Firebase("https://blazing-fire-2739.firebaseio.com/users"); 
userRef.orderByChild("email").equalTo($scope.user.email).once("value", function(snapshot) { 
    if(snapshot.exists()){ 
    console.log(snapshot.val()); 
    } 
}); 

А вот рабочий plnkr example этого второго запроса.

Для получения дополнительной информации ознакомьтесь с документацией для Query.equalTo() и Query.orderByChild().

Важная сторона: при заказе дочерним ключом, если вы знаете, каковы будут индексы для вашего запроса, «вы можете определить их с помощью правила .indexOn в правилах безопасности и Firebase для лучшей производительности». Обратитесь к Indexing Data documentation за дополнительной информацией.


Возможно, было бы полезно прочитать за Retrieving Data Guide.

Чтобы проверить данные своей Firebase в браузере и увидеть приоритеты объектов, вы можете использовать Vulcan - удивительное расширение Google Chrome. Это то, что Vulcan выглядит в Chrome Devtools:

vulcan


Надеюсь, что это помогает!

+1

Отличная работа ! Обложка большинства деталей. В качестве общей рекомендации 'orderByChild()' заменяет приоритеты и должен быть предпочтительным. Приоритеты в конечном итоге будут постепенно отменены в пользу детских полей. – Kato

+0

Спасибо @ Kato, это здорово узнать. –

+0

Вид любопытного, как с equalTo, snap.key() фактически не возвращает ключ возвращаемого объекта ... см. Plunkr: http://plnkr.co/edit/BbWn3DpNjbXtx8pgH8j8?p = preview – morgs32