Как работать с вложенным хэшем с динамическими ключами (PorstgreSQL JSONB) с помощью Cube.js ?

#ruby-on-rails #postgresql #analytics #cube.js

#ruby-на-рельсах #postgresql #аналитика #cube.js

Вопрос:

Я совсем новичок в 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» являются идентификаторами категорий. Ключи, связанные с идентификатором категории «314», являются «329»,»331″,»332″, «333»; которые являются идентификаторами вопросов. В каждой категории будет несколько вопросов. Для разных записей идентификаторы категорий и вопросов будут динамическими. Например, для другой записи идентификатор категории и идентификаторы вопросов, связанные с этим идентификатором категории, будут другими. Мне нужно получить доступ к значениям, связанным с идентификатором ключевого вопроса. Например, чтобы получить доступ к значению «1.5», мне нужно сделать это в моем файле схемы:

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

Но проблема здесь в том, что эти идентификаторы будут динамическими для разных записей в базе данных. Вместо «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}}}
 

Как я могу узнать и получить доступ к этим динамическим идентификаторам и их значениям, поскольку мне также нужно выполнять математические операции со значениями. Спасибо!

Комментарии:

1. Как вы определяете идентификаторы, к которым вам нужно получить доступ в каждой структуре? Будете ли вы получать их внешне? Или это что-то вычисленное на основе списка существующих идентификаторов в структуре?

2. @MichalT Когда пользователь заполняет опрос, создается запись этого типа в формате JSON. т.Е. Категории и вопросы уже созданы в системной базе данных. Когда пользователь отвечает на конкретный вопрос, относящийся к определенной категории, мы просто связываем эти идентификаторы и ответ пользователя в форме JSON.

Ответ №1:

Как правило, сложно запускать отчеты на основе SQL для высокодинамичных данных JSON. У Postgres есть некоторые полезные функции для работы с JSON, и вы могли бы использовать json_each или json_object_keys плюс несколько объединений, чтобы добраться туда, но вполне вероятно, что производительность и удобство обслуживания такого запроса будут, мягко говоря, сложными 😅 Cube.js в конечном счете выполняет SQL-запросы, поэтому, если вы перейдете квыше маршрута запрос должен быть легко перенесен на Cube.js схема.

Другим подходом было бы создание отдельного конвейера обработки данных, который собирает все данные JSON и сводит их в единую таблицу. Затем конвейер должен сохранить эти данные обратно в выбранной вами базе данных, откуда вы могли бы затем использовать Cube.js чтобы запросить его.