如何在 Cube.js 的帮助下使用动态键 (PorstgreSQL JSONB) 处理嵌套哈希?

问题描述

我是 Cube.js 的新手。我一直在尝试将 Cube.js 分析功能与我的 Ruby on Rails 应用程序集成。数据库是 Postgresql。在数据库中,有一个名为 answers_json 的列,其数据类型为 jsonb,其中包含嵌套的哈希值。该列的数据示例是:

**answers_json:**
"question_weights_calc"=>
    {"314"=>{"329"=>1.5,"331"=>4.5,"332"=>1.5,"333"=>3.0},"315"=>{"334"=>1.5,"335"=>4.5,"336"=>1.5,"337"=>3.0},"316"=>{"338"=>1.5,"339"=>3.0}}

在同一列中有更多的键具有相同的散列结构,如上所示。我发布了特定部分,因为我只会处理这部分。我需要帮助访问散列中的值。该列具有嵌套散列。在上面的示例中,键“314”、“315”和“316”是类别 ID。与类别 ID“314”相关联的键是“329”、“331”、“332”、“333”;哪些是问题 ID。每个类别都会有多个问题。对于不同的记录,类别和问题 ID 将是动态的。例如,对于另一条记录,与该类别 ID 关联的类别 ID 和问题 ID 将不同。我需要访问与关键问题 ID 关联的值。例如,要访问值“1.5”,我需要在我的架构文件中执行此操作:

**sql: `(answers_json -> 'question_weights_calc' -> '314' ->> '329')`**

但这里的问题是,对于数据库中的不同记录,这些 id 将是动态的。除了“314”和“329”,它们还可以是其他一些数字。在此处添加不同记录的 json 以进行说明:

**answers_json:**
"question_weights_calc"=>{"129"=>{"273"=>6.0,"275"=>15.0,"277"=>8.0},"252"=>{"279"=>3.0,"281"=>8.0,"283"=>3.0}}}

我如何知道和访问这些动态 ID 及其值,因为我还需要对值执行数学运算。谢谢!

解决方法

作为一般规则,很难对高度动态的 JSON 数据运行基于 SQL 的报告。 Postgres 确实有 some useful functions for dealing with JSON,您可能可以使用 json_eachjson_object_keys 加上一些连接来到达那里,但很可能这样一个查询的性能和可维护性很难说? Cube.js 最终会执行 SQL 查询,所以如果你走上面的路线,查询应该很容易转移到 Cube.js 模式。

另一种方法是创建一个单独的数据处理管道,用于收集所有 JSON 数据并将其拼合到一个表中。然后管道应该将此数据存储回您选择的数据库中,然后您可以从那里使用 Cube.js 查询它。