在Firebase中查询日期范围和时间范围

时间:2018-12-07 06:00:00

标签: android firebase nosql geofire

我想查询我的数据集以查找在日期范围和位置范围(geohash范围)内出现的结果。我正在努力寻找一个好的解决方案。

我正在使用GeoFire,并尝试了各种按日期或位置分类数据的方法。每天都可以轻松构建一个节点,并在其中构建地基哈希,但是例如,如何在不下载所有5000个结果的情况下分页浏览这些数据,例如在纽约市呢?

如果我可以先在geohash上排序,然后在日期上排序,这很容易实现,但是我不能在firebase或任何NoSQL数据库中做到这一点。

一定有人遇到了这种多范围查询问题,希望您能分享所学到的知识。

谢谢

1 个答案:

答案 0 :(得分:0)

  

每天为每个节点构建一个节点并在其中散布geohash很容易,但是例如我如何才能在不下载所有5000个结果的情况下分页浏览这些数据呢?

如果我误解了你的问题,请告诉我。您能否为代表特定日期的节点构造一个DatabaseReference,创建一个GeoFire对象和一个GeoQuery,并每天重复一次?

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("path/to/dayNode");
GeoFire geoFire = new GeoFire(ref);
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(37.7832, -122.4056), 0.6); // Use this for addGeoQueryEventListener() or something else
// See https://github.com/firebase/geofire-java

这将使您只能下载37.7832,-122.4056附近的0.6公里内的位置。为了防止一次下载太多结果,请从较小的半径开始,然后从此处增加?

作为附带说明,我相信Firebase Firestore允许使用多种光标条件,例如:

db.collection("locations")
    .orderBy("locationhash")
    .orderBy("date")
    .startAt(locationHash, startDate)
    .limit(25);

不幸的是,除非您扩展在GeoFire或GeoFirestore中完成的工作,否则我认为您无法在按日期和分页进行排序时指定半径。希望其他人有更好的主意。