2015-04-21 1 views
2

Я использую firebase в сочетании с GeoFire, это отлично работает, но мне нужен еще один запрос, и я не уверен, как это сделать.Использование методов запросов Firebase .startAt() и .endAt() для диапазонов дат

Это мой GeoFire/Firebase запрос:

var geoFire = new GeoFire(ref.child("geoFire")); 

var geoQuery = geoFire.query({ 
    center: [51.315077, 3.73261], 
    radius: 100 //kilometers 
}) 

geoQuery.on("key_entered", function(key, location, distance) { 

    ref.child("articles").child(key).on("value", function(snap){ 

     var x = snap.val() 
     DATA.push(x) 

    }) 

}) 

Это моя JSON базы данных в firebase:

geoFire 

-JmE05U-Wbr5LGRSh0Z8 
-JmE0COUFBRPZIBqwfYN 

articles 

-JmE05U-Wbr5LGRSh0Z8 
    * ... 
    * articlePostDate: 2015/04/26 08:00:00 
    * ... 
-JmE0COUFBRPZIBqwfYN 
    * ... 
    * articlePostDate: 2015/04/26 12:00:00 
    * ... 
-JmE0Iq7-uvrk5Tg_K8_ 
    * ... 
    * articlePostDate: 2015/01/26 08:00:00 
    * ... 
-JmE0MrnstNv9d_8ozQ4 
    * ... 
    * articlePostDate: 2015/04/26 15:00:00 
    * ... 

выше GeoFire/Firebase запрос возвращает 2 статьи (но может 100 статей), это правильно.

Мой вопрос:

Как я могу продлить Firebase запрос ниже, так что я могу получить записи на основе диапазона articlePostDates? Например, все GeoFire возвратили записи с датой публикации между 2015/04/26 07:00:00 и 2015/04/26 16:00:00? Я думаю, что это с .startAt() и .endAt(), но я не уверен, как это сделать.

ref.child("articles").child(key).on("value", function(snap){ 

    var x = snap.val() 
    DATA.push(x) 

}) 

Thx для вашего консультирования.

+0

Вы не можете комбинировать их в том, как вы предлагали здесь. Хорошей альтернативой было бы архивирование старых статей в другой список, чтобы вы получали только текущие в пути 'articles /', устраняя необходимость в дополнительной фильтрации. Если количество элементов меньше ста, также возможна простая фильтрация на стороне клиента. Объясняя фактический прецедент и ограничения, помимо предлагаемого решения, можно было бы сэкономить много догадок для поиска хорошего подхода. – Kato

ответ

2

Прежде чем использовать startAt() или endAt(), вам необходимо заказать свой список с помощью orederByChild().

Попробуйте следующий код (Исходная точка включена).

ref.child("articles") 
.orderByChild('articlePostDate') 
.startAt('2015/04/26 07:00:00').endAt('2015/04/26 16:00:00') 
.on("value", function(snap){ 
    var x = snap.val() 
    DATA.push(x) 
}) 

Для получения дополнительной информации, пожалуйста, обратитесь к Firebase Query.startAt

+0

Я получаю сообщение об ошибке «Ошибка: b равно null». Но если я попробую его без метода .child (key), он будет работать. Я думаю, что это имеет какое-то отношение к запросу GeoFire, так как это возвращает только 1 запись за раз. GeoFire должен вернуть список элементов, тогда я могу сделать диапазон в списке. – kevinius

+0

.child (key) здесь означает, что вы будете заказывать и запрашивать ровно одного ребенка, что, вероятно, неразумно, если дети не были также коллекциями, которые, похоже, не являются целью OP. – Kato

+0

Действительно, мне нужна коллекция. GeoFire возвращает строку, которая является идентификатором статьи. Я могу собрать id в массиве и прослушать ref.child(). On ("value") в geoQuery.on ("ready"). Но тогда возникает вопрос: как я могу получить только статьи с идентификаторами в массиве и все еще иметь возможность делать фильтрацию даты? – kevinius

Смежные вопросы