我正在使用Firebase,我想检索具有特定地址坐标的用户。
为此,我使用此方法
showPopUpInfo(longitude:any, latitude:any){
return this.afs.collection('Utilizador',ref=>ref.where('morada.Coordenadas.latitude', '==', latitude).where('morada.Coordenadas.longitude', '==' , longitude)).get()
}
变量纬度和经度的值是:
经度:-8.364
纬度:41.237
我的firebase“ Utilizador”文档:
查询的输出是:
我认为找不到用户是因为尽管纬度和经度的值相同,但是纬度和经度的精度不同,但是我不知道如何解决此问题
实际上,文档的纬度和经度值存储为字符串,如此屏幕截图所示。您可以说出来,因为它们周围都有引号。如果将鼠标悬停在该字段上,您还将在右侧看到“(字符串)”。
如果您在查询中使用数字值,则查询将从不与此文档匹配,因为Firebase认为任何数字都不等于任何字符串。
如果您的查询实际上使用的是完全相同的字符串,则会得出一个匹配项。但是通常不建议将数字存储为字符串,因为字符串的排序方式不同于数字,因此您将无法正确地对这些数字值执行范围查询。
一点建议-不要在函数中使用TypeScript类型any
。具体而言,根据查询的要求仅接受string
或number
。如果您传递了错误的类型,这将有助于在代码中引发错误。
在特定位置查找对象的最典型方法是使用基于范围的地理查询。在足够小的范围内,您可以准确地获得所需的结果。不幸的是,此类地理位置目前尚未内置到Firestore中。
而且,由于Firestore只能在单个字段上包含查询范围,因此您不能直接对其进行经度和纬度。相反,大多数开发人员使用基于Geohashes的解决方案。地理哈希将纬度和经度合并为一个(字母数字)值,可以在范围上对其进行过滤。
要了解有关在Firestore上运行地理位置查询的更多信息,建议您观看video of my talk on the topic。但绝对也可以查看涵盖Firestore上地理查询主题的其他问题: