You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase 9中startAt与endAt的使用方法(含地理查询场景)

Firestore 地理查询(Firebase 9 模块化版本)

Firestore本身不支持直接基于经纬度的范围查询,通常需要配合GeoHash实现。下面是替代旧版.startAt()/.endAt()的Firebase 9实现步骤:

前提准备

  • 给你的Firestore文档添加两个字段:
    • geopoint: 存储Firestore官方的GeoPoint类型(用于记录经纬度)
    • geohash: 存储对应坐标的GeoHash字符串(用于范围筛选)
  • 安装GeoHash生成库,比如ngeohash:
    npm install ngeohash
    

核心查询逻辑

  1. 计算目标坐标附近的GeoHash范围:
    用ngeohash的bbox方法,根据目标经纬度和搜索半径,得到GeoHash的起始和结束值。
  2. 用Firebase 9的模块化API构建查询:
    旧版的链式调用collectionRef.where(...).startAt(...).endAt(...),在Firebase 9里要改用query()函数,把筛选条件作为参数传入。

完整代码示例

// 导入Firebase 9模块
import { getFirestore, collection, query, where, getDocs } from "firebase/firestore";
import ngeohash from 'ngeohash';

const db = getFirestore();

// 目标坐标:示例为北京天安门附近(39.9042, 116.4074),搜索半径1公里
const targetLat = 39.9042;
const targetLng = 116.4074;
const radiusInKm = 1;

// 计算GeoHash边界
const { minlat, maxlat, minlon, maxlon } = ngeohash.bbox(ngeohash.encode(targetLat, targetLng), radiusInKm);
const startHash = ngeohash.encode(minlat, minlon);
const endHash = ngeohash.encode(maxlat, maxlon);

// 构建查询(对应旧版的startAt/endAt,这里用>=和<=实现范围筛选)
const placesRef = collection(db, 'places');
const geoQuery = query(
  placesRef,
  where('geohash', '>=', startHash),
  where('geohash', '<=', endHash)
);

// 执行查询并处理结果
async function fetchNearbyPlaces() {
  const querySnapshot = await getDocs(geoQuery);
  querySnapshot.forEach((doc) => {
    console.log(doc.id, '=>', doc.data());
  });
}

fetchNearbyPlaces();

注意事项

  • GeoHash的精度决定了查询范围,半径越小,需要的GeoHash精度越高(可以通过ngeohash.encode(lat, lng, 6)这样的方式指定精度位数)。
  • 查询结果可能包含范围外的点,需要在客户端额外过滤:计算文档的geopoint与目标坐标的实际距离,剔除超出设定半径的结果。

内容的提问来源于stack exchange,提问作者Harris001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:01:25