【问题标题】:Reading Data from Firestore从 Firestore 读取数据
【发布时间】:2019-07-01 10:12:03
【问题描述】:

我正在创建一个应用程序,用户可以在其中创建事件并查看其他用户创建的其他事件,前提是半径为 10 公里。我将所有数据存储在 Firestore 中。

这就是应用程序的工作方式,从用户端获取所有事件,并且仅显示距离小于 10 公里的事件。

问题是如果数据库中有 10,000 个事件,而用户在 10km 半径范围内只有 10 个事件,那么显然它将计为 10,000 次读取,这太昂贵了。

对这个问题有什么建议吗? 我想到的一种解决方案是根据地理区域存储数据,但如何实现是另一个问题。

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    您无需为 10 000 次读取付费,而只需为您的查询检索到的文档付费,在您的示例中为 10 次。

    这里有一段来自 Firebase 的精彩视频,介绍了他们的计费系统:https://www.youtube.com/watch?time_continue=224&v=6NegFl9p_sE

    另外请记住,对于文档读取以外的查询,例如对集合 ID 列表的请求,您需要为一个文档读取付费。

    【讨论】:

    • 当然我假设你知道事件和用户位置,我虽然很明显
    • 我的意思是我的代码将首先获取 10,000 个事件,然后它会检查事件的位置,然后它将用户的位置与事件位置进行比较。如果距离小于 10 公里,则只会显示。
    • 这更像是获取一个事件,比较它,然后为所有 10,000 个事件显示它。这就是为什么它将计为 10,000 次读取
    【解决方案2】:

    我建议计算与用户经度 10 公里距离对应的最小和最大经度。您对纬度执行相同操作并在 Firestore 查询中使用这些限制。这样做您将有更少的事件/读取,并且您可以计算精确的距离以抑制 10 到 14 公里半径之间的事件......如果需要。

    要计算您的限制,您可以使用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);
    

    【讨论】:

    • 你能举个例子吗?
    • 不,它没有:(
    【解决方案3】:

    https://stackoverflow.com/a/43804487/9139407(@alex-mamo 的回答)

    希望对您有所帮助!

    【讨论】:

    • 不要认为这回答了 OP 问题
    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 2020-10-24
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2020-04-19
    相关资源
    最近更新 更多