Запрос Firestore — упорядочение по двум полям / порядок по радиусу И метке времени

#android #firebase #google-cloud-firestore

# #Android #firebase #google-облако-firestore

Вопрос:

Структура данных:

введите описание изображения здесь

Придерживаться примеров Тодда Керпельмана:

Допустим, я пытаюсь упорядочить все рестораны в пределах определенного радиуса по полю метки времени (например, время последнего обновления меню).

Мне также нужна разбивка на страницы для этого запроса, поэтому сначала мне нужно 3 ресторана, затем еще 3 и т. Д., Упорядоченные по их полю метки времени.

Я нашел GeoFire для Android, который использует GeoHash алгоритм для хранения GeoPoints (координат) в виде чисел в вызываемом поле geoFireLocation . Теперь я могу запросить ближайшие рестораны в пределах определенного радиуса, позвонив:

 .whereNearTo(queryLocation, searchDistance)
 

который в рамках hud реализован следующим образом:

 public GeoFireQuery whereNearTo(QueryLocation queryLocation, Distance distance) {
    BoundingBoxUtils geoPointUtils = new BoundingBoxUtils(distance.getUnit());
    BoundingBox boundingBox = geoPointUtils.getBoundingBox(queryLocation, distance.getDistance());
    this.query = this.query
        .orderBy("geoFireLocation")
        .whereGreaterThanOrEqualTo("geoFireLocation", boundingBox.getMinimumMatch())
        .whereLessThanOrEqualTo("geoFireLocation", boundingBox.getMaximumMatch());
    return this;
  }
 

Пока это работает нормально.

Теперь я пытаюсь упорядочить по этому полю временной метки следующим образом:

 .orderBy("timestamp").whereNearTo(queryLocation, searchDistance)
 

Firestore говорит мне:

У вас есть неравенство, где фильтр (whereLessThan (), whereGreaterThan () И т. Д.) В поле ‘geoFireLocation’, и поэтому у вас также должно быть ‘geoFireLocation’ в качестве вашего первого поля OrderBy () , но ваш первый OrderBy () в настоящее время находится в поле ‘timestamp’ вместо этого

Попытка упорядочить по временной метке после геолокации, похоже, полностью игнорируется firebase:

 .whereNearTo(queryLocation, searchDistance).orderBy("timestamp")
 

Печать временных меток документов в том порядке, в котором я их получаю:

         for (DocumentSnapshot documentSnapshot :
                a.getDocuments()) {
            Log.e("MY_LOG", documentSnapshot.toObject(EventPOJO.class).getTimestamp().toString());
 

В консоли я вижу, что документы не упорядочены по временной метке:

 E/MY_LOG: 2020-12-17T23:00:00.000 01:00
E/MY_LOG: 2020-12-13T23:00:00.000 01:00
E/MY_LOG: 2020-12-15T23:00:00.000 01:00
E/MY_LOG: 2020-12-14T23:00:00.000 01:00
E/MY_LOG: 2020-12-09T23:00:00.000 01:00
 

Я знаю, что все еще могу сортировать свои результаты по их меткам времени на client-side .
Это может привести к странным эффектам перелистывания при использовании представления с бесконечной прокруткой.

Я мог бы получить 3 ближайших ресторана и отсортировать их по метке времени, затем получить еще 3 и объединить их с последними 3 и отсортировать снова. В худшем случае все предыдущие рестораны переместятся в конец моего списка, если все их временные метки старше, чем те, которые были получены из новых ресторанов.

Могу ли я что-нибудь сделать в этой ситуации?

Комментарии:

1. Почему вы говорите «кажется, полностью игнорируется Firebase»? Пожалуйста, также отредактируйте свой вопрос и добавьте свою структуру базы данных в виде скриншота.

2. @AlexMamo Я добавил скриншот и дополнительное объяснение к тому, что вы упомянули