Firebase - Firestore按时间顺序获取包含地理位置和时间戳的数据

时间:2018-06-14 06:34:50

标签: firebase firebase-realtime-database google-cloud-firestore google-cloud-functions

我目前正在开发一个firebase项目。在这个特定情况下,我们决定使用Firestore。 为了简单起见,我们假设我们有多个应用程序用户在给定时间将其位置发布到服务器,因此我们的文档看起来像这样

Footprint
-> username 
-> createdAt (timestamp in milliseconds)
-> location (Geopoint)

现在用户应该能够搜索他周围的所有用户,这很容易通过使用像这样的查询:

firestore.collection('footprint')
.where('location', isGreaterThan: bounds['lower'])
.where('location', isLessThan: bounds['upper'])

bounds ['lower']和bounds ['upper']包含2个Geopoints。

现在这可以工作,但它给了我一个靠近地点的数据。但是用户只按照时间顺序关注它。更像是这个位置附近的最后100人。因此,向用户发送10.000数据集似乎很糟糕,只是为了在客户端订购它们。通常没有Wi-Fi。

所以我想对结果进行分页并尝试以下方法:

firestore.collection('footprint')
.where('location', isGreaterThan: bounds['lower'])
.where('location', isLessThan: bounds['upper'])
.orderBy('createdAt')
.limit(25)

无效,Firebase在这种情况下首先强制执行orderBy'location'。但结果是

firestore.collection('footprint')
.where('location', isGreaterThan: bounds['lower'])
.where('location', isLessThan: bounds['upper'])
.orderBy('location')
.orderBy('createdAt')
.limit(25)

并没有帮助我,如果它位于我当前的位置旁边,它将首先显示2017年的数据集。

所以我考虑了替代方案并找到了以下内容:

  1. 群集位置
  2. 我认为我可以聚集位置,例如将所有位置从17.13-17.17映射到17.15,然后我可以使用等于查询来获取我想要的数据。

    firestore.collection('footprint')
    .where('location', isEqual: bounds['closest'])
    .orderBy('createdAt')
    .limit(25)
    

    但现在我遇到了问题,如果用户想要在100公里范围内的所有内容,我将不得不做大量的查询。考虑使用5 km群集,对于100 km半径内的所有群集,将是40 * 40个查询。即便如此,我也有问题限制这些数据,因为我关心时间顺序,我仍然需要向用户发送大约10.000个数据集。

    1. 使用其他日期(或类似的东西)字段
    2. 我觉得这是我最接近找到问题的真正解决方案

      Footprint
      -> username 
      -> createdAt (timestamp in milliseconds)
      -> createdSearch (String looks like 2018-06-14)
      -> location (Geopoint)
      

      我现在可以查询给定日期的数据,如

      firestore.collection('footprint')
      .where('createdSearch',isEqual:'2018-06-14')
      .where('location', isGreaterThan: bounds['lower'])
      .where('location', isLessThan: bounds['upper'])
      .orderBy('location')
      

      这有效但我必须为我想要的每一天发送额外的查询,我将不得不在客户端订购数据,因此没有限制。如果我有很多数据,我还需要让我的搜索字段更明确,如'2018-06-14 12:00'。但后来我不得不发出更多的疑问......

      3尝试将geopoint和timestamp组合到一个Field

      这应该在理论中起作用,如果我找到一种方法将两个值组合成一个字段,允许查询它们并使用相同的字段对它们进行排序,这将起作用。但我不知道该怎么做。

      我觉得这应该是一个常见的问题,我发现了一些关于范围查询和其他领域排序的其他问题,但没有涉及到地理位置。

      那么查询给定位置附近的数据集并使用Firestore按时间顺序将其恢复的原因是什么?

      我还应该提一下,我不希望用户等待30秒,所以如果可能的话应该是一个快速的解决方案。如果需要其他技术(firebase)或数据结构,那也没关系。

1 个答案:

答案 0 :(得分:0)

如果找到解决我的问题的唯一“好方法”,那就是将最新版本与firebase函数一起使用。

firestore.collection('footprint')
.where('createdSearch',isEqual:'2018-06-14')
.where('location', isGreaterThan: bounds['lower'])
.where('location', isLessThan: bounds['upper'])
.orderBy('location')

因此,该应用向firebase函数发出HTTPS请求,该函数会加载所有内容,但会进行一些服务器端过滤以减少返回值的数量。由于这不是我特定问题的真正解决方案,因此我不会将其标记为已回答