我正在使用AngularFire2库在firebase中进行查询。在我的firebase中,我有数据集合,在其中,我有很多行latitude
和longitude
,如下所示:
- data
- 1404033346513076_1998422263740845
- location
- latitude: 23.7907795
- longitude: 90.403898
- 1404033346513076_1998422263740888
- location
- latitude: 23.9907795
- longitude: 91.403898
我拥有当前位置的latitude
和longitude
,并且我有一个辅助函数,可以确定当前位置与火力基础数据的位置之间的距离。假设,功能如下:
calculateDistance(currentLoc, destLoc) {
return routeDistance(currentLoc, destLoc); // It return in meters
}
现在,我需要一个查询,它将从firebase返回10行,这些行与当前位置的距离最近。
我知道,我可以在firebase中查询如下:
constructor(private firebaseDBProvider: AngularFireDatabase) {
}
getDatas(): any {
return this.firebaseDBProvider.list('data', ref => ref.orderByChild("location").startAt(0).endAt(3));
}
但是,它不会提供我想要的确切数据。
另一件事,我注意到,当我在查询下运行时,它会返回前10行。
return this.firebaseDBProvider.list('data', ref => ref.limitToFirst(10));
但是,如果要执行以下查询,则会返回 0 行。
this.firebaseDBProvider.list('data', ref => ref.startAt(0).endAt(10));
为什么? startAt 和 endAt 应与 limitToFirst(10)相同。
那么,查询应该是什么,以便我可以从当前位置返回10行 sortest distance ?
答案 0 :(得分:2)
您的帖子中有两个问题。让我们尝试回答每个问题。
Q1:"我需要一个查询,它将从firebase返回10行,这些行距离当前locationList项目的最近距离"
A1:您可能知道,您将无法使用" Firebase数据库查询引擎"在查询时触发calculateDistance()
功能,即Firebase只能根据此处详述的方法https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data进行排序。
换句话说,您必须在可以执行您的函数的环境中循环来自data
节点的整个数据集:在您的前端或可能在云函数中(例如, HTTPS,作为REST API)
Q2:"为什么? startAt和endAt应该与limitToFirst(10)相同。"
A2:不,他们是不同的。正如文档中所述," startAt()返回大于或等于指定键或值的项目,取决于所选择的订购方法"
首先,您必须在此行中包含逐个方法
this.firebaseDBProvider.list('data', ref => ref.startAt(0).endAt(10));
其次,根据逐个方法,这一行不一定会返回10个记录,而是所有order-by参数在0到10之间的记录。
答案 1 :(得分:0)
我认为,使用GeoFire可以获得最近距离获取数据顺序的解决方案。