В документаций для 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:
Надеюсь, что это помогает!
Попробуйте положить заказBychild ('email') перед этим. Кроме того, equalTo() FTW. – Kato