Ten specyficzny jsonb przykład z original answer brakowało warstwę tablicy []
wokół nie pierwotnego obiektu dla zapytania obudowy. Zostało to naprawione.
zachowanie udokumentowane dla PostgreSQL 9.4.x jsonb Containment and Existence stanów:
Ogólna zasada jest taka, że zawarte obiekt musi odpowiadać obiekt zawierający co do struktury i zawartości danych
...
Jako specjalny wyjątek od ogólnej zasady, że struktury musi odpowiadać, tablica może zawierać wartość prymitywną
specjalny wyjątek pozwala nam wykonać następujące czynności:
CREATE TABLE tracks (id serial, artistnames jsonb);
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING gin (artistnames);
INSERT INTO tracks (id, artists) VALUES (1, '["blink-182"]');
INSERT INTO tracks (id, artists) VALUES (2, '["The Dirty Heads", "Louis Richards"]');
Możemy zapytanie o zamknięcie, zgodnie z ogólną zasadą:
SELECT * FROM tracks WHERE artistnames @> '["The Dirty Heads"]';
id | artistnames
----+---------------------------------------
2 | ["The Dirty Heads", "Louis Richards"]
(1 row)
Możemy również zapytać o powstrzymywanie za pomocą specjalny wyjątek od tej tablicy zawiera pierwotne typy:
SELECT * FROM tracks WHERE artistnames @> '"The Dirty Heads"';
id | artistnames
----+---------------------------------------
2 | ["The Dirty Heads", "Louis Richards"]
(1 row)
Istnieją 4 typy pierwotne, które umożliwiają rozprzestrzenianie i istnienie zapytania na tablicach pracy:
- ciąg
- liczba
- logiczną
- null
Ponieważ przykład wspomniał Pan w swoim pytaniu ma do czynienia z obiektami zagnieżdżone wewnątrz tablicy, nie kwalifikują się do szczególnego wyjątku wymienionego powyżej:
CREATE TABLE tracks (id serial, artists jsonb);
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
INSERT INTO tracks (id, artists) VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists) VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Możemy zapytań dla powstrzymywania stosując ogólną zasadę:
SELECT * FROM tracks WHERE artists @> '[{"name": "The Dirty Heads"}]';
id | artists
----+-----------------------------------------------------------
2 | [{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]
(1 row)
Obiekty nie są uważane za prymitywny typ, więc poniższe zapytanie do skażenia nie kwalifikują się do szczególnego wyjątku i dlatego nie działa:
SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
id | artists
----+---------
(0 rows)
W mojej odpowiedzi brakowało warstwy macierzy w przykładzie, do którego się odwołujesz. To jest teraz naprawione. Odpowiedź @ potatosalad zawiera wyjaśnienie. –
Dla przyszłych widzów na to pytanie, znalazłem ten link http://stackoverflow.com/a/30592076/2405689, który pokazuje, w jaki sposób zapytać 'jsonb' tablicę obiektów coś, co powyższe zapytanie ma osiągnąć. – ArchNoob