【问题标题】:Firebase Database - Add Index on "dynamic" childFirebase 数据库 - 在“动态”子项上添加索引
【发布时间】:2018-02-20 14:55:33
【问题描述】:

我正在使用 Firebase 数据库来存储游戏的分数。在我决定实施“每周得分”之前,一切正常。

为了能够按分数过滤,然后按周排序,我将数据存储在以下结构中:

game_scores-weekly
    2018-01-29
        user_id: { score, date, bla, bla bla}
        user_id: { score, date, bla, bla bla}
        user_id: { score, date, bla, bla bla}

    2018-02-05
        user_id: { score, date, bla, bla bla}
        user_id: { score, date, bla, bla bla}

所以,这工作得很好,但由于“game_scores-weekly/new_week” indexOn “score”上没有索引,我每周都会收到关于性能问题的烦人警告。手动添加索引有效...直到下周,所以不是一个选项。

    "game_scores-weekly": {
      "2018-02-19": {
        ".indexOn": ["score", "uid"]
      },
      "2018-02-12": {
        ".indexOn": ["score", "uid"]
      }
    } 

有没有办法在日期中以某种方式指定通配符,以便它适用于任何新日期?或者也许我可以每周以编程方式创建新索引,或者有没有其他我可能没有想到的解决方案?

另外,考虑过手动创建一年中所有星期的列表并一次性添加,但可能会受到限制?

最后但并非最不重要的一点是,我只对本周和上周的分数感兴趣,任何较旧的东西我都想保留一些历史数据,但我不会在游戏中查询它,所以可能摆脱旧周的索引。

干杯!

【问题讨论】:

  • 令我感到奇怪的是,您没有将它们存储为用户的孩子。
  • 我还存储了分数发布在“分数条目”的子项中的时间戳,但据我从文档/阅读中了解到,您不能按一个字段过滤然后排序由同一查询中的另一个。必须处理应用程序逻辑中的一个或另一个,这在处理大型记录时效率不高/不可行。
  • 我知道在 Firebase 函数中,您可以使用方括号来指定变化的值。在您的情况下:game_scores-weekly/{date}/user_id。或许可以在其他 SDK 中做同样的事情。

标签: firebase firebase-realtime-database


【解决方案1】:

感谢@Tristan 为我指明了正确的方向。

我使用以下代码定义索引,现在警告消失了:

"game_scores-weekly": {
  "$date": {
    ".indexOn": ["score", "uid"]
  }
} 

现在看起来超级明显,但在文档中找不到任何明确的内容。

请注意,$date 实际上可以是任何名称,似乎您可以使用任何 $identifier 指定变量值。

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多