Estoy implementando una aplicación que contiene un mapa. En este mapa, el usuario puede seleccionar su ubicación, con el fin de encontrar elementos de otros usuarios en su radio.
Para hacer eso, cuando un usuario escribe un elemento en Firestore, solo estoy geocodificando inversamente la ubicación seleccionada, en un idioma específico (inglés), para obtener el nombre de la dirección (en inglés) y almacenarlo como un campo de cadena normal en un nuevo documento de Firestore.
Así como esto:
export const GOOGLE_MAPS_GEOCODING_ENDPOINT = ( latitude, longitude, key, language = "en" ) => `https://maps.googleapis.com/maps/api/geocode/json?` + `latlng=${latitude},${longitude}&key=${key}&language=${language}`; export default async (coordinate) => { const endpoint = GOOGLE_MAPS_GEOCODING_ENDPOINT( coordinate.latitude, coordinate.longitude, Constants.manifest.ios.config.googleMapsApiKey ); const res = await fetch(endpoint); const data = await res.json(); // Get the address components const addressComponents = data.results[0]?.address_components; // Build the location object const location = buildLocation(addressComponents); return location; };Implementé esto hace algunos años, y recientemente leí sobre Firestore GeoQueries (no estoy seguro si se agregó el año pasado o recientemente, pero nunca lo he usado).
Actualmente, solo estoy realizando consultas como:
// Fetching items near me const query = db .collection("items") .where("random", "<", randomId) .where("type", "==", type) .where("location.city", "==", city) .orderBy("random", "desc");Como puede ver, estoy usando el campo de país para realizar algún tipo de "GeoQuery". Pero no me gusta la idea de tener que almacenar direcciones en la base de datos, con la restricción de que, independientemente de la internacionalización de la app, deben estar en inglés.
¿Actualmente es posible combinar la función Firestore GeoQuery para realizar consultas "complejas" como la que describí?
Quiero decir, obtener artículos aleatorios cerca de mí cuyo precio sea más bajo que X, o cosas así (hablando de latitud y longitud, no de direcciones).
Porque, como he leído en la documentación, tenemos que ordenar la colección por geohashes... y en mi caso necesito obtener documentos aleatorios dentro de algunos límites. Entonces algo como:
const q = db. .collection("items") .where("randomId", "<=", randomId) .orderBy("geohash") .startAt(b[0]) .endAt(b[1]);no funcionará, ya que el primer orderBy debería ser "randomId". ¿Hay algún ejemplo o solución? ¿Debería usar subcolecciones (que contienen elementos con límites similares (en un rango)) en su lugar?