#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 Я добавил скриншот и дополнительное объяснение к тому, что вы упомянули