如何使用功能(用于位置距离过滤)过滤Firestore收集数据

时间:2018-12-04 07:34:56

标签: javascript google-cloud-firestore

想知道如何使用一个函数(其中一些函数args是集合文档的值)来过滤文档的Firestore集合。

假设某些Firestore收集了以下格式的文档

{
  pointOfInterest: "Some string label"
  longitude: -100.123
  latitude: 50.456
}

也有一些代码可以检索用户的地理坐标(在我的情况下是通过react-native),类似

const getCurrentLatLong = () => {
    // do some stuff, then...
    return { latitude: someNumber, longitude: someOtherNumber }
}

最终想做的是运行类似的东西

let currentLocation = getCurrentLatLong()
let filteredSet = firebase
    .firestore()
    .collection('MyCollection')
    // filtering each individual document 
    .filter(function (document, currentLocation) {
         let docLat = document.latitude
         let docLong = document.longitude
         return distance(
             {latitude: docLat, longitude: docLong},
             currentLocation) 
             < SOME_CONST_DISTANCE
     })

所以最后得到的是集合中所有文档中与currentLocation的距离小于SOME_CONST_DISTANCE的一些filteredSet。

一些谷歌搜索导致了一些潜在的起点(https://stackoverflow.com/a/45359952/8236733https://firebase.google.com/docs/reference/js/firebase.database.Query#on),但不确定如何使用链接中显示的内容。任何有关如何实现这一目标的建议或文档,将不胜感激。

2 个答案:

答案 0 :(得分:1)

无法将函数传递到Cloud Firestore中,然后该函数用于过滤返回的文档。您要么需要传递静态值(例如要返回的经度和纬度),要么需要读取所有文档并使用客户端功能进行过滤。

您要尝试的操作被称为地理查询:根据文档到已知点的距离返回文档。不幸的是,即使功能支持geographical point data type,Cloud Firestore仍未内置该功能。可以自己构建它,尽管您应该意识到目前这种查询效率很低。

要了解更多有关此的信息:

答案 1 :(得分:1)

因此,如前所述,Firestore不支持本地地理查询。对于我一直在从事的一些开源工作来说,这有点可耻了。

https://github.com/mbramwell1/GeoFire-Android

不仅可以执行标准的Firestore查询,而且还可以按位置进行搜索。看看它可能会做什么。