MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zapytania wewnątrz tablic Postgres JSON

Poniższa oryginalna odpowiedź dotyczy tylko Postgres 9.3. Aby uzyskać odpowiedź na Postgres 9.4, zobacz aktualizację poniżej.

Jest to oparte na odpowiedziach Erwina , ale to pytanie jest nieco bardziej wyraźne.

Identyfikatory w tym przypadku to duże s, więc utwórz funkcję pomocniczą do konwersji tablicy JSON na bigint Postgresa tablica:

CREATE OR REPLACE FUNCTION json_array_bigint(_j json)
  RETURNS bigint[] AS
$$
SELECT array_agg(elem::text::bigint)
FROM json_array_elements(_j) AS elem
$$
  LANGUAGE sql IMMUTABLE;

Moglibyśmy po prostu łatwo (i być może bardziej do ponownego wykorzystania) zwrócić tekst zamiast tego tablica. Podejrzewam, że indeksowanie w bigint jest dużo szybszy niż text ale mam trudności ze znalezieniem dowodów online na poparcie tego.

Aby zbudować indeks:

CREATE INDEX "myindex" ON "mytable" 
  USING GIN (json_array_bigint("blob"->'ids'));

W przypadku zapytań to działa i używa indeksu:

SELECT * FROM "mytable" 
  WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');

Wykonanie tego zadziała również w przypadku zapytań, ale nie używa indeksu:

SELECT * FROM "mytable" 
  WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));

Aktualizacja do wersji 9.4

Postgres 9.4 wprowadził jsonb rodzaj. To dobra odpowiedź na temat jsonb i kiedy należy go używać w json . Krótko mówiąc, jeśli kiedykolwiek pytasz o JSON, powinieneś użyć jsonb .

Jeśli zbudujesz swoją kolumnę jako jsonb , możesz użyć tego zapytania:

SELECT * FROM "mytable"
  WHERE blob @> '{"ids": [185603363289694211]}';

@> is Postgres' zawiera operator, udokumentowany dla jsonb tutaj .Dzięki odpowiedzi Alaina za zwrócenie mi na to uwagi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak znaleźć nieużywane indeksy w MongoDB?

  2. Konfigurowanie uwierzytelniania MongoDB-CR jako domyślnego w MongoDB 3.x

  3. Jak uzyskać podzielone na strony/pocięte dane tablicy poddokumentów w kolekcji mongo?

  4. Jak mogę pobrać bazę danych rekordów drom w widoku edycji w Laravel?

  5. MongoDB $indexOfArray