Det bästa sättet att fråga efter plats i firestore

Jag använder Firebase 8.10.0 med Vue js 2.6.14

Jag försöker fråga i Firestore om dokumenten som är mindre än 3 km från min plats Och upptäckte att jag inte kunde göra den här frågan i Firestore, jag blev uppriktigt sagt besviken. Sedan efter att ha sett en video av Frank van Puffelen på YouTube "Querying Firebase and Firestore"1 förstod jag att det bästa sättet att göra den här frågan är genom Geohash Så nu använder jag ngeohash för att konvertera lat long till geohash-kod sedan geofirestore att fråga (jag använder inte geofirestore för att lägga till data i firestore eftersom jag inte hittar ett sätt att lägga till dokument med ett specifikt id eller uppdatera ett befintligt dokument med geofirestore)

konvertera lat long till geohash-kod

import geohash from "ngeohash";

const ask = async () => {
  try {
    const loc = await new Promise((resolve, reject) => {
      navigator.geolocation.getCurrentPosition(resolve, reject, {
        enableHighAccuracy: true,
      });
    });
    const { latitude, longitude, accuracy } = loc.coords;

    return {
      lat: latitude,
      lng: longitude,
      accuracy: accuracy,
      geohash: geohash.encode(latitude, longitude)
    };
  } catch (err) {
    console.log(err);
  }
};

lägg till data i Firestore

ref.set({
  g: {
    geopoint: new db.GeoPoint(lat, lng),
    geohash: geohash
  },
  ...data
}, { merge: true }).then(() => {
  console.log("Done");
});

fråga från firestore

let query = geocollection.near({ center: new db.GeoPoint(lat, lng), radius: 3 });
query.get().then((data) => {
  console.log(data.size);
});

Är det jag gör rätt är detta det bästa sättet att fråga efter plats i firestore? och ökar geofirestore antalet avläsningar eftersom jag gjorde en förfrågan för ett tag sedan och resultatet var bara 5 av 1000 dokument, men jag fann att mer än 60 avläsningar registrerades i Firebase-konsolen. Är detta normalt eller skulle det bara vara 5 avläsningar?

Svar

Geohashes låter dig söka efter dokument inom ett visst geografiskt område. Dessa områden kan överlappa med avståndet från en specifik punkt som du anger, men du kommer vanligtvis att behöva söka efter flera intervall av geohash för att få alla dokument runt en viss punkt.

En enkel visualisering av detta utifrån vad jag visade i videon du länkade:

Så frågan här är att returnera alla dokument inom den grå cirkeln. Men för att få dessa dokument måste vi fråga alla fyra färgområdena av geohashes.

Om du har en relativt enhetlig fördelning av dokumenten kan du sluta med detta:

Varje stift i den här bilden är ett dokument som läses av Firestore, men bara de gröna stiften är dokument som faller inom det intervall du faktiskt ville ha.

I mina experiment, för en enhetlig fördelning av dokument, slutar du med att läsa mellan 2x och 10x fler dokument än vad som behövs med detta tillvägagångssätt. Om denna överläsning är ett kostnadsproblem för dig, överväg att använda Realtime Database och dess geofire-bibliotek för dina geoqueries. Även om överläsningen kommer att vara densamma är faktureringsstrukturen baserad på bandbredd och mängden bandbredd som konsumeras av geoindexet är ganska minimal där.