【问题标题】:Query Geofire for top X number of records in the area?查询 Geofire 以获取该区域中前 X 条记录?
【发布时间】:2026-02-09 20:30:01
【问题描述】:

我试图围绕 Geofire 展开思考,所以暂时假设我的 firebase 数据库对美国各地的酒吧进行排名。在这种情况下,我的 firebase 查询将返回该国排名前 100 名的酒吧的评级列表。如果地图缩小到整个国家,Geofire 是否只能返回该国前 100 名的酒吧?另外如果把地图放大到纽约,Geofire 是不是也只能返回纽约的前 100 名?换句话说,我想返回给定查看区域的前 100 名,其中列表显然会随着列表的移动而变化。它可以处理这个吗?如果是这样,我能看到一个例子吗?

提前致谢!

【问题讨论】:

    标签: javascript angularjs firebase ionic-framework geofire


    【解决方案1】:

    您可以使用地理查询来设置中心和半径以进行放大和缩小

    var geoQuery = geoFire.query({
      center: [10.38, 2.41],
      radius: 10.5
    });
    
    var center = geoQuery.center();  // center === [10.38, 2.41]
    var radius = geoQuery.radius();  // radius === 10.5
    
    geoQuery.updateCriteria({
      center: [-50.83, 100.19],
      radius: 5
    });
    
    center = geoQuery.center();  // center === [-50.83, 100.19]
    radius = geoQuery.radius();  // radius === 5
    
    geoQuery.updateCriteria({
      radius: 7
    });
    
    center = geoQuery.center();  // center === [-50.83, 100.19]
    radius = geoQuery.radius();  // radius === 7

    对于前 100 个,您可以使用方法,例如当您收到当前 geoQery 的 100 个元素时,调用取消。

    var geoQuery = geoFire.query({
      center: [10.38, 2.41],
      radius: 10.5
    });
    
    var bars = []
    
    var onKeyExitedRegistration = geoQuery.on("key_exited", function(key, location, distance) {
      console.log(key + " exited query to " + location + " (" + distance + " km from center)");
      bars.push(key);
      if(bars.length>=100)
      {
        geoQuery.cancel();
      }
    });

    reference doc

    【讨论】:

    • 感谢您的帮助。因此,您给出的示例将显示的“条”数量限制为 100,但它可以用于返回该区域中的前 100 个吗?如果纽约有 10,000 条 bar,我们只想显示前 100 条。换句话说,bars 数组中的 100 条记录是如何排序的?或者无论我们想要排序的“等级”如何,查询只是停止在 100 处。相反,我们可以在给定区域的情况下加载前 100 个条形的条形数组吗?
    • geofire 只能给你记录的key,然后你可以用那个key去查询其他记录。所以要获得排名信息,您必须查询半径内的所有键,然后进行排名比较。您可以将排名信息放在key中,即(firebase_key_rank),并在查询10k记录之前对key进行排名,因此您只查询100条记录,但您仍然需要查询所有10k key。