在 firestore 中按位置查询的最佳方式

The best way to query by location in firestore

我正在使用 Firebase 8.10.0 和 Vue js 2.6.14

我正在尝试在 Firestore 中查询距我所在位置不到 3 公里的文档 并发现我无法在 firestore 中执行此查询,坦率地说,我很失望 然后在 YouTube 上观看 Frank van Puffelen 的视频后 "Querying Firebase and Firestore"1 我知道执行此查询的最佳方法是通过 Geohash 所以现在我正在使用 ngeohash 将 lat long 转换为 geohash 代码然后 geofirestore 进行查询(我没有使用 geofirestore 将数据添加到 firestore 因为我找不到添加文档的方法特定 id 或使用 geofirestore 更新现有文档)

将经纬度转换为 geohash 代码

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);
  }
};

将数据添加到 firestore

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

来自 firestore 的查询

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

我的做法是否正确,这是在 firestore 中按位置查询的最佳方式吗?而geofirestore是否增加了阅读次数,因为我前段时间做了一个查询,结果1000个文档中只有5个,但是我发现在Firebase控制台中记录了60多个阅读次数。这是正常的还是应该只有 5 个读数?

Geohashes 允许您查询特定地理区域内的文档。这些区域可能与您指定的特定点的距离重叠,但您通常需要查询多个范围的 geohashes 以获得特定点周围的所有文档。

基于我在您链接的视频中展示的内容的简单可视化:

所以这里查询的是return灰色圆圈内的所有文档。但是为了获得这些文档,我们需要查询所有四种颜色的 geohashes 范围。

如果您的文档分布相对均匀,您可能会得到这样的结果:

此图中的每个图钉都是 Firestore 读取的文档,但只有绿色图钉是您实际需要的范围内的文档。

在我的实验中,对于均匀分布的文档,您最终阅读的文档比使用此方法所需的文档多 2 到 10 倍。如果这种过度阅读对您来说是一个成本问题,请考虑将实时数据库及其 geofire 库用于您的地理查询。虽然过度阅读是一样的,但计费结构是基于带宽的,geoindex 消耗的带宽量在那里非常小。