我正在创建一个应用程序,用户可以在其中创建事件并仅在半径10Km内才能看到其他用户创建的其他事件。我正在将所有数据存储在Firestore中。
这是应用程序的工作方式,从用户端提取所有事件,仅显示距离小于10公里的事件。
问题是,如果数据库中有 10,000 个事件,并且用户位于 10 个事件的 10km 半径内,那么显然将算作 10,000 次读取,这太昂贵了。
对这个问题有什么建议吗? 我想到的一个解决方案是根据地理区域存储数据,但是如何实现却是另一个问题。
答案 0 :(得分:0)
您无需支付10,000次读取的费用,而只需查询查询到的文档,在您的示例中为十个。
以下是Firebase的精彩视频,介绍了他们的结算系统:https://www.youtube.com/watch?time_continue=224&v=6NegFl9p_sE
还请记住,对于文档读取以外的查询(例如要求收集ID的列表),您需要为读取一个文档付费。
答案 1 :(得分:0)
我建议计算与用户经度相距10 km的最小和最大经度。您可以对纬度进行相同的操作,并在Firestore查询中使用这些限制。这样做您将拥有较少的事件/读数,并且可以计算确切的距离来抑制10到14 km半径内的事件...如有必要。
要计算您的限制,您可以使用https://www.movable-type.co.uk/scripts/latlong.html中的以下公式(目标点已指定距离和距起点的方位角),并且可以研究在线JavaScript计算器。
φ2= asin(sinφ1⋅cosδ+ cosφ1⋅sinδ⋅cosθ)
λ2=λ1+ atan2(sinθ⋅sinδ⋅cosφ1,cosδ-sinφ1⋅sinφ2)
其中φ是纬度,λ是经度,θ是方位角(从北向顺时针方向),δ是角距d / R; d是以米为单位的行驶距离,R是地球半径(6371e3)。
方位角为0°时,您可以获得LatitudeMax
在方位角为90°的情况下,您可以获得东经
在方位角为180°的情况下,您可以获得LatitudeMin
在方位角为270°的情况下,您可以获得西经
由于地球是经度在-180°至180°之间的球体
longitudeMin = Min(longitudeEast,longitudeWest)
longitudeMax = Max(longitudeEast,longitudeWest)
Firestore部分就像:
CollectionReference col = Firestore.instance.collection("mycollection");
Query latitudeMinQuery = col.where('latitude', isGreaterThan: LatitudeMin);
Query latitudeMaxQuery = latitudeMinQuery.where('latitude', isLessThan: LatitudeMin);
Query longitudeMinQuery = latitudeMaxQuery.where('longitude', isGreaterThan: LongitudeMin);
Query longitudeMaxQuery = longitudeMinQuery.where('latitude', isLessThan: LongitudeMax);
答案 2 :(得分:-1)
https://stackoverflow.com/a/43804487/9139407(@ alex-mamo的回答)
希望有帮助!