Google Firebase - 重新格式化 JSON 输出

Google Firebase - reformat JSON output

我正在使用 Google Firebase,它生成 JSON 数据如下:

{
    "tasks": {
        "-LzH6kQjS_nY4P97EONB": {
            "createdBy": "Andrew",
            "date": "\"2020-01-23T11:17:24.213Z\"",
            "description": "Some task description.",
            "done": false
        }
    }
}

我想将其转换成这种格式:

[
    {
        "id": "-LzH6kQjS_nY4P97EONB",
        "createdBy": "Andrew",
        "date": "\"2020-01-23T11:17:24.213Z\"",
        "description": "Some task description.",
        "done": false
    }
]

我想我可以处理转换部分(如果你们在这里没有看到一些不可能的东西)但是我想不出 "returning" 转换 JSON 文件的方法所以它总是link 下可用。有没有一种方法可以轻松做到这一点,而且不会危及 Firebase 安全性?

以下是一些可能的解决方案:

  1. 制作Database Triggered Cloud Function that will run each time a task is added at your tasks path. That function should use the newly added data to update an array at a different path, like tasksAsArray. You can use a transaction读取现有数组,添加新项并保存新数组。然后在 Qlik 的“.json”url 中使用该路径。

  2. 制作一个 HTTP Callable Function 将从数据库中读取您的 tasks 并 return 一个您想要的格式的数组作为响应。

  3. 修改客户端代码,直接写入所需格式的数据。


对于解决方案 1,随着时间的流逝和数据的增长,事务的性能将开始下降,但可能不会很明显。如果您的响应中不需要非常旧的数据,除了只在数组中添加任务之外,您还可以从中删除旧数据,以限制数组的大小。


使用解决方案 2,您可以Limit Queries仅包括最近几个月或几年的任务。


解决方案 3 要求客户准确知道已经有多少任务*,以便他们将新任务添加到适当的索引处。你说会有20个并发用户,所以有多个客户端写入同一个路径的风险,会发生覆盖。

为防止覆盖,您可以使用 this one 等数据库规则,并在客户端处理错误(使用正确的索引重试)。

您也可以从客户端执行数据库事务,但是随着数组变大,这会使添加任务变慢。云函数不关心做某事是否需要几秒钟,但用户关心:)

*要查找已经有多少任务,您可以读取整个数组并计算元素。相反,您可以创建一个后台云函数来维护 taskCount 路径,这就是:任务数量。然后客户可以简单地读取该数字。