Как сделать заказ на ближайшее расстояние от текущего местоположения в AngularFire2? - PullRequest
0 голосов
/ 01 мая 2018

Я использую библиотеку AngularFire2 для запроса в firebase. В моей базе данных у меня есть коллекция data , и в них много строк с latitude и longitude, как показано ниже:

- data
    - 1404033346513076_1998422263740845
        - location
           - latitude: 23.7907795
           - longitude: 90.403898
    - 1404033346513076_1998422263740888
        - location
           - latitude: 23.9907795
           - longitude: 91.403898

У меня есть latitude и longitude моего текущего местоположения, и у меня есть вспомогательная функция, которая может определять расстояние в метрах между текущим местоположением и местоположением на основе данных пожарной базы. Предположим, функция выглядит так:

calculateDistance(currentLoc, destLoc) {
  return routeDistance(currentLoc, destLoc); // It return in meters
}

Теперь мне нужен запрос, который вернет 10 строк из базы огня, которые находятся на самом кратком расстоянии от текущего местоположения.

Я знаю, что могу запросить, как показано ниже в базе данных:

  constructor(private firebaseDBProvider: AngularFireDatabase) {
  }

  getDatas(): any {
    return this.firebaseDBProvider.list('data', ref => ref.orderByChild("location").startAt(0).endAt(3));
  }

Но он не предоставит мне точные данные, которые я хочу.

Еще одна вещь, которую я заметил, это то, что когда я запускаю запрос ниже, он возвращает первые 10 строк.

return this.firebaseDBProvider.list('data', ref => ref.limitToFirst(10));

Но, если вы хотите выполнить приведенный ниже запрос, он возвращает мне 0 строк.

this.firebaseDBProvider.list('data', ref => ref.startAt(0).endAt(10));

Почему это? startAt и endAt должны работать так же, как limitToFirst (10) .

Итак, каким должен быть запрос, чтобы я мог вернуть 10 строк, которые находятся на кратчайшем расстоянии от моего текущего местоположения?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Я думаю, использование GeoFire может быть решением для получения порядка данных на минимальном расстоянии.

0 голосов
/ 02 мая 2018

В вашем посте два вопроса. Попробуем ответить на каждый из них.

Q1: «Мне нужен запрос, который вернет 10 строк из базы данных, которые находятся на самом кратком расстоянии от текущего элемента locationList»

A1: Как вы, возможно, знаете, у вас не будет возможности "Механизм запросов к базе данных Firebase", запускающий вашу функцию calculateDistance() во время выполнения запросов, т.е. Firebase может сортировать только на основе методов, подробно описанных здесь https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data.

Другими словами, вам придется зацикливаться на всем наборе данных из узла data в среде, которая может выполнять вашу функцию: в вашем внешнем интерфейсе или, возможно, в облачной функции (например, вызываемой HTTPS, как REST API)


Q2: «Почему это так? StartAt и endAt должны работать так же, как limitToFirst (10).»

A2: Нет, они разные.

Как объяснено в документе, "startAt () возвращает элементы, которые больше или равны указанному ключу или значению , в зависимости от выбранного метода order-by ."

Итак, во-первых, вы должны включить порядок строк в этой строке

this.firebaseDBProvider.list('data', ref => ref.startAt(0).endAt(10));

И, во-вторых, в зависимости от упорядоченного метода эта строка не обязательно будет возвращать 10 записей, но все записи, для которых параметр упорядочения находится в диапазоне от 0 до 10.

...