Есть ли способ объединить запрос GeoFireStore с обычным запросом Firestore? - PullRequest
1 голос
/ 13 июня 2019

Я хочу запросить пользователей, которые хранятся в коллекции с именем «Пользователи». У каждого пользователя есть поля, такие как возраст и вес. Есть ли способ, которым я могу опрашивать пользователей по расстоянию от пользователя, выполняющего поиск в GeoFire, и объединять его с поисковыми запросами FireStore? Например, я пользователь, который ищет кого-то, кто находится в радиусе 20 миль, но также хочет найти кого-то, кто на 2 года моложе или старше его.

1 Ответ

2 голосов
/ 13 июня 2019

База данных Firestore может фильтровать по нескольким полям, но может выполнять фильтрацию диапазона только по одному из этих полей. Так что этот запрос возможен:

collection.where("age", ">", 18).where("age", "<", 20)

Но это невозможно:

// !!!THIS WON'T WORK!!!
collection.where("latitude", ">", 18.001).where("longitude", "<", 21.312)

Все библиотеки GeoFirestore, о которых я знаю, используют геохеш (как они использовались в исходных библиотеках GeoFire), чтобы иметь возможность делать что-то, что на первый взгляд невозможно в базовой базе данных: фильтрация документов в географическом диапазоне на основе широты и долгота.

Геошаши работают своим волшебством, объединяя широту и долготу местоположения в одно строковое значение, которое можно фильтровать с различной степенью точности. Это возможно, поскольку вы можете (вроде) выразить, как один градус долготы связан с градусом широты. Таким образом, вы как бы объединяете zip и lon цифры в одно значение, в котором первая цифра каждого старшего разряда.

Теперь это также объясняет, почему вы не можете просто добавить еще один фильтр диапазона в гео-запрос. Вы должны найти способ выразить разницу в возрасте с точки зрения расстояния. Если вы можете сделать это, это просто вопрос кодирования дополнительной информации в geo-age-hash. Это звучит довольно сложно для меня, но это по крайней мере возможно.

Первая проблема заключается в том, что не существует общего способа связать дополнительные свойства с широтой и долготой, поэтому вы будете самостоятельно решать эту проблему. Мне кажется, что большинство разработчиков отказываются от этого требования или выполняют дополнительный заказ / фильтрацию на стороне клиента.

Если вы хотите добавить фильтр равенства в геохэш (например, документы для людей в определенном географическом диапазоне, которым ровно 18), это определенно возможно на уровне Firestore, хотя я не знаю, предоставляют ли библиотеки GeoFirestore основные возможности запроса для этого.

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

Я также рекомендую проверить эти предыдущие вопросы по теме:

Многие из них касаются GeoFire для (оригинальной) базы данных Firebase Realtime, но те же принципы применимы к Firestore.

...