¿Cómo clasifico los datos por geohash en firestore v9? Los documentos de V8 dan este ejemplo:
const bounds = geofire.geohashQueryBounds(center, radiusInM); const promises = []; for (const b of bounds) { const q = db.collection('cities') .orderBy('geohash') .startAt(b[0]) .endAt(b[1]); promises.push(q.get()); } // Collect all the query results together into a single list Promise.all(promises).then((snapshots) => { const matchingDocs = []; for (const snap of snapshots) { for (const doc of snap.docs) { const lat = doc.get('lat'); const lng = doc.get('lng'); // We have to filter out a few false positives due to GeoHash // accuracy, but most will match const distanceInKm = geofire.distanceBetween([lat, lng], center); const distanceInM = distanceInKm * 1000; if (distanceInM <= radiusInM) { matchingDocs.push(doc); } } } return matchingDocs;No se como traducirlo a V9, he probado asi:
const { latitude, longitude } = location?.coords || {}; if (latitude && longitude) { const radiusInM = 50 * 100000; const center = [latitude, longitude]; const bounds = geofire.geohashQueryBounds(center, radiusInM); for (const b of bounds) { const q = query( collection(firestore, "laboratories"), orderBy("geoHash"), startAt(b[0]), endAt(b[1]) ); const querySnapshot = await getDocs(q); querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); } }Pero no devuelve ningún resultado, ¿cómo funcionan esas consultas, porque en los resultados de los límites cuando configuro el radio en 50 * 100 obtengo 4 matrices con hashes, supongo que esos son puntos en un mapa?
0: (2) ['u3j', 'u3k'] 1: (2) ['u3n', 'u3p'] 2: (2) ['u3m', 'u3n'] 3: (2) ['u3q', 'u3r']sin embargo, cuando aumento el radio de búsqueda a 50 * 100000, solo obtengo
0: (2) ['h', '~']No entiendo donde me equivoco, uno de esos lugares esta intencionalmente muy cerca de donde estoy. Y suponiendo que esta búsqueda fuera exitosa, ¿devolvería solo ubicaciones en el área o se ordenarían? ¿Quizás debería usar alguna biblioteca adicional para eso? ¿Me recomendarías uno, por favor? ¿Y debo almacenar la latitud y la longitud junto con geohashes o esto sería suficiente?
Publicar los comentarios de Frank para mayor visibilidad.
Su traducción a la sintaxis v9 se ve bien, pero tiene un error tipográfico en el nombre del campo aquí: orderBy("geoHash") , debe reemplazarse con orderBy("geohash") , con una h minúscula en hash .
El campo geohash es un valor de cadena, no un tipo de datos específico. Es posible que desee consultar el artículo sobre geohashes o ver un video al respecto.
Para reiterar, el problema en su código aquí es que escribió mal el nombre del campo en su segunda consulta/v9, ya que deletreó geoHash de manera diferente que en la primera consulta/v8. Incluso si elimina las cláusulas startAt / endAt , no obtendrá resultados, ya que ningún documento tiene un campo con ese nombre mal escrito.