Запрос PostgreSQL массива JSONB по вложенному объекту - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующий массив данных JSON:

{ arrayOfObjects: 
    [
        {
            "fieldA": "valueA1", 
            "fieldB": { "fieldC": "valueC", "fieldD": "valueD" }
        },
        {
            "fieldA": "valueA", 
            "fieldB": { "fieldC": "valueC", "fieldD": "valueD" }
        }
    ]
}

Я хотел бы выбрать все записи, где fieldD соответствует моим критериям (а fieldC неизвестно). Я вижу похожие ответы, такие как Запрос для элементов массива внутри типа JSON , но там запрашиваемое поле представляет собой простую строку (похожую на поиск по fieldA в моем примере), где моя проблема заключается в том, что я хотел бы запрос на основе объекта внутри объекта в массиве.

Я пробовал что-то вроде select * from myTable where jsonData -> 'arrayOfObjects' @> '[ { "fieldB": { "fieldD": "valueD" } } ]' ), но, похоже, это не сработало.

Как мне добиться того, чего я хочу?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете выполнить запрос «содержит» непосредственно в поле JSONB и передать необходимый минимум:

SELECT *
FROM mytable
WHERE json_data @> '{"arrayOfObjects": [{"fieldB": {"fieldD": "valueD"}}]}'::JSONB;

Это, конечно, предполагает, что fieldD всегда вложено в fieldB, но это довольно низкая планка, чтобы очистить ее с точки зрения согласованности схемы.

...