База данных 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.