Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Postgresql json поиск в массиве по значению поля, postgresql json search in array
AllesKlar  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3708
Пользователь №: 38635
На форуме: 3 года, 7 месяцев, 26 дней
Карма: 199




Важно! Postgresql v 9.3
в данной версии нет типа и функций для jsonb


Таблица:
CREATE TABLE aa_ym_test (
id serial primary key,
cl_json json
);

Данные:

insert into aa_ym_test (cl_json) values
('{"uniqueId":"15036812687876940861125AT","fileName":"ym-test-010.jpg","categories":[{"type":"directory","titles":[],& ; ;quo t;directories":[],"path":"YM/images"}]}'),
(
'{"uniqueId":"15036812687855470861125AT","fileName":"ym-test-010.jpg","categories":[{"type":"asset","titles":[],"di rectories":[],"path":"YM/images"}]}'),
(
'{"uniqueId":"15036812687888870861125AT","fileName":"ym-test-010.jpg","categories":[{"type":"directory","titles":[],& ; ;quo t;directories":[],"path":"YM/video"}]}'),
(
'{"uniqueId":"15036812687446820861125AT","fileName":"ym-test-010.jpg","categories":[]}')


Нужно получить все id, для которых:
- categories->path == 'YM/images'
и
- categories->type == 'directory'

В SELECT-те все нормально
select id, json_array_elements(t.cl_json->'categories')->'path', json_array_elements(t.cl_json->'categories')->'type' from aa_ym_test t 

1	"YM/images"	"directory"
2 "YM/images" "asset"
3 "YM/video" "directory"


Но в WHERE работать не хочет.
ни так:
select id from aa_ym_test where json_array_elements(cl_json->'categories')->'path' = '{"YM/images"}' and json_array_elements(cl_json->'categories')->'type' = '{"directory"}'

ни так:
select id from aa_ym_test where json_array_elements(cl_json->'categories')->'path'::text = '"YM/images"' and json_array_elements(cl_json->'categories')->'type'::text = '"directory"'


В обоих случаях одна и та же ошибка: Operator does not exist: json = unknown

sergeiss ?
:rolleyes:


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15409
Пользователь №: 4190
На форуме: 9 лет, 6 месяцев, 16 дней
Карма: 470




Етттаааааа.... Подумать надо smile.gif Вот так с ходу не отвечу, это факт.

Во-первых, у тебя ошибка копипасты в исходных данных, в инсерте. Там всякая шняга пролезла.

Это сообщение отредактировал sergeiss - 17.03.2017 - 18:56


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3708
Пользователь №: 38635
На форуме: 3 года, 7 месяцев, 26 дней
Карма: 199




движок форума режет

sql файл http://zalil.su/5107877

для наглядности user posted image


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15409
Пользователь №: 4190
На форуме: 9 лет, 6 месяцев, 16 дней
Карма: 470




AllesKlar, вот смотри... Не знаю, поможет ли тебе :) Но в таком варианте у меня сработало:

select id
from aa_ym_test
where
cl_json->'categories'->0->>'path' = 'YM/images'
and
cl_json->'categories'->0->>'type' = 'directory'

Честно скажу - не знал, гуглил. "За свой счёт" (с) ;) Читал тут https://www.postgresql.org/docs/9.3/static/...tions-json.html, см. самую первую табличку.
Фактически, я сначала выбрал нулевой элемент из массива категорий и у него выбрал значение у нужного ключа (которое возвращается в текстовом виде) и сравнил его с текстовой же строкой.

PS. Насколько я понимаю, json_array_elements(t.cl_json->'categories')->'path' возвращает все значения 'path' из массива. В данном случае это всего один элемент, но это всё равно не строка, а массив из одного элемента. Поэтому у тебя в условии в таком написании и не срабатывало, т.к. ты пытался работать с массивом, как с одним элементом.
Когда указываем '->0', то указываем на определенный элемент в массив, на самый первый. Ну и затем '->>path' говорит, что надо взять значение у ключа path и вернуть в текстовом виде.

Это сообщение отредактировал sergeiss - 17.03.2017 - 19:44


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Цитата (AllesKlar @ 17.03.2017 - 19:08)
sql файл http://zalil.su/5107877
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3708
Пользователь №: 38635
На форуме: 3 года, 7 месяцев, 26 дней
Карма: 199




Guest
Спасибо.

sergeiss
И тебе спасибо.
Точно, индекс. Но это только усугубляет.
Грубо говоря, ТЗ такое:

элемент "categories" - это массив объектов типа category
И их может быть больше, чем одна, массив же.
И нужно выбрать id записи, если среди категорий есть одна, с подходящим путем (path)

Это дерево. Категории, артикли.
Артикль может быть в нескольких категориях.
Нужно выбрать все артикли из одной конкретной категории.
Категория идентифицируется путем (свойство path)


Цитата (sergeiss @ 17.03.2017 - 17:38)
гуглил. "За свой счёт" (с) wink.gif Читал тут https://www.postgresql.org/docs/9.3/static/...tions-json.html, см. самую первую табличку.

Ну, сие я первым делом прочитал smile.gif


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3708
Пользователь №: 38635
На форуме: 3 года, 7 месяцев, 26 дней
Карма: 199




Ларчик просто открывался.
Всего-то нужно было придти с работы домой, поесть и погулять с собакой :D

SELECT *
FROM aa_ym_test t, json_array_elements(t.cl_json->'categories') obj
WHERE obj->>'path' = 'YM/images' and obj->>'type' = 'directory';


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3708
Пользователь №: 38635
На форуме: 3 года, 7 месяцев, 26 дней
Карма: 199




Ну и в заключении, JSON в Postgresql штука интересная, мощная, но, при больших объемах данных , бестолковая, с точки зрения производительности smile.gif

1.000.000 результирующих строк из 4х связанных проиндексированных таблиц выплевывается примерно за 3 секунды, тогда как тот же объем данных, полученный из разбора одного поля типа json одной таблицы заняло около 2х минут

В общем, инструмент офигенный, но пихать его куда попало не стОит smile.gif


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Нужно индекс создать для obj->>'path' и obj->>'type' тогда будет быстро. Многие уже используют postgre/mysql как документоориентированную субд. Это удобно и избавляет от проблем объектно-реляционного отображения.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15409
Пользователь №: 4190
На форуме: 9 лет, 6 месяцев, 16 дней
Карма: 470




Цитата (AllesKlar @ 17.03.2017 - 22:19)
Всего-то нужно было придти с работы домой, поесть и погулять с собакой

Последние 2 позиции особенно помогают переключению мозгов smile.gif Проверено мной на своем опыте.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16220
Пользователь №: 6543
На форуме: 8 лет, 10 месяцев, 19 дней
Карма: 304

Трезвый :
6 лет, 7 месяцев, 29 дней


Цитата (sergeiss @ 18.03.2017 - 08:59)
Последние 2 позиции особенно помогают переключению мозгов

Блин, а уменя кот blink.gif Что жил, то зря. sad.gif


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15409
Пользователь №: 4190
На форуме: 9 лет, 6 месяцев, 16 дней
Карма: 470




оффтоп:
Цитата (twin @ 18.03.2017 - 15:25)
Блин, а у меня кот   Что жил, то зря. 

Коты тоже помогают smile.gif Но по-другому.
Это собака друг человека. А у кота наоборот, человек друг кота.
Но в любом случае "способствуют" smile.gif Заявляю это авторитетно, как владелец собачьего сына породы миттельшнауцер и двух кошек породы "дворяне".


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса