Pull to refresh

Comments 15

Отличные конкурентные приемущества. Теперь будем ждать поддержки json и jsonb в Node.js ORM-ках.
У меня построитель запросов knex.js, он уже умеет автоматом преобразовывать json в объект JS и наоборот, при выборке / обновлении соответственно.

На его базе построена ORM Bookshelf.js, я думаю, там как раз идёт имплементация выборок по json, либо всё уже есть. Так или иначе, всегда есть raw query.
Когда уже появится возможность авторефреша материализованных представлений…
Можете пояснить про null подробнее в json и jsonb? Их нельзя хранить или какие то другие ограничения (при создании запросов к полям н-р)?
Можно хранить, но имеется ввиду, что null в JSON — не тот NULL, который в PostgreSQL.
Спасибо, посмотрел на примеры запросов, и понял в каком смысле.
>… Операторы @>,? и некоторые другие специфичны для типа jsonb

Довольно сомнительное решение — ведь JSON — это просто структура, но состоящая из таких же простых типов, как и другие колонки таблицы — зачем им нужен новый набор крючков? Достаточно парсеру запросов определить, что работают над JSONb полем и СТАНДАРТНЫЕ операторы использовать в новом контексте — EXIST, >, <, = и т.п.
Мне кажется, что правильней именно отдельными операторами, чтобы не смешивать понятия. Так как EXISTS — это существование набора строк, < — меньше в сравнивании двух скаляров. Иначе прийдется в голове держать другой смысл для JSON-поля (и обращатся к структуре таблицы, чтобы посмотреть, что именно за операция и для чего применяется).
в последнем примере с security_barrier ноутис не лишний с секретной книгой?
Да, лишний, ошибка copy/paste. Исправил.
Здравствуйте, у меня почему-то не видит тип данных jsonb, не встречали такое случаем? Пробовал и в консоли, и через php (pdo_pgsql), и программки различные. Вот запрос:

CREATE TABLE book ( id serial NOT NULL, params jsonb NOT NULL DEFAULT '{}');


ERROR: type «jsonb» does not exist
Версия: psql (9.4beta3, сервер 9.3.5)

Если оставляю просто json — то соответственно таблица создается. Гугл мне отказывается отвечать.

Вы точно с той БД, что нужно, соединяетесь (jsonb появился в 9.4)?
сервер 9.3.5
Верно ли я понял, что на данное время существуют только возможность частичной выборки из json колонок (по имени ключей, индексам, пути), но изменение (alteration), допустим удаление/изменение отдельного элемента массива — нет?
Для формирования JSON из элемента, массива или записи предусмотрен ряд функций. Для установки некоторого поля в данных JSON подойдёт такая пользовательская функция:
Скрытый текст
CREATE OR REPLACE FUNCTION fn_set_json_key ( v_data json, v_key text, v_value anyelement )
RETURNS json AS
$BODY$
  SELECT coalesce 
    (
      (
        SELECT
          (
            '{' || string_agg ( to_json ( key ) || ':' || value, ',' ) || '}'
          )
        FROM
          (
            SELECT *
            FROM json_each (  v_data )
            WHERE key != v_key

            UNION ALL

            SELECT v_key, to_json ( v_value )
          ) AS fields
      ), '{}'
    )::json;
$BODY$
LANGUAGE SQL IMMUTABLE;


Для операций с отдельным элементом массива можно придумать что-то аналогичное.
Ок, благодарю. Имел ввиду простые универсальные встроенные средства, по аналогии sql update. То есть допустим нужно обновить часть данных в большом JSON, чтобы при этом не нужно было сначала вытянуть всё поле JSON, сделать какое-то единичное изменение, и потом записать назад весь JSON целиком.
Sign up to leave a comment.

Articles