Firebase数据库结构和查询格式选项

时间:2016-08-17 21:57:44

标签: ios swift firebase firebase-realtime-database geofire

基本上,我的应用有基于位置的帖子,可以上调/下调。 我需要构建一个查询,返回位于指定区域的前15个upvoted帖子,并在过去24小时内完成。来自sql背景,我发现通过顺序和过滤选项,JSON格式和firebase的内置查询不必要地做到了这一点。我意识到我很可能需要进行大量的客户端过滤,所以我问的是JSON结构和查询格式将最小化客户端过滤。到目前为止,这是我的JSON格式:

  "posts" : {

    "-KPFIsDbf3WUljWvBwi-" : {

      "latitude" : 33.64114800203589,
      "longitude" : -116.4236003651668,
      "time" : 1.47129994542173E12,
      "uid" : "wjXpBBJMBVPvRVG48fFkerAw6TD3",
      "upvotes" : 0
},

我尝试使用Geofire,但不幸的是,它似乎只能按区域查询,而且由于我想按地区和时间查询(除其他事项外),使用Geofire将无法很好地扩展。

1 个答案:

答案 0 :(得分:0)

以下是使用GeoFire和Firebase查询组合在类似设置中执行的操作:

步骤1(保存):保存帖子时,首先使用随机ID将其保存到数据库。然后,获取该ID,创建GeoFire位置,并将您的帖子ID设置为位置键。

步骤2(查询):这将是一个2步查询

步骤2a:获取指定区域内的所有GeoFire位置。现在,您可以从快照中获取所有位置的键,并在每个位置附加单个数据事件处理程序。

步骤2b:按照upvotes的数量维护一个排序的post对象数组。在单个事件侦听器的快照中,首先检查时间戳以查看它是否在过去24小时内。接下来,如果数组的计数小于15,请将您的帖子添加到排序位置(使用适当的解析方法)。如果它已经有15,那么你需要查看数组中最小的最低元素是否有更多的upvotes。如果没有,您需要在阵列中找到要替换的位置。在完成对Geofire的每个快照的解析之后,您将获得过去24小时内的一系列帖子,按照upvotes进行排序。