sql >> Databáze >  >> NoSQL >> MongoDB

Dotazování uvnitř polí Postgres JSON

Následující původní odpověď platí pouze pro Postgres 9.3. Odpověď na Postgres 9.4 najdete v aktualizaci níže.

Toto staví na Erwinových odkazovaných odpovědích , ale je k této otázce trochu explicitnější.

ID jsou v tomto případě bigint s, takže vytvořte pomocnou funkci pro převod pole JSON na Postgres bigint pole:

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;

Mohli jsme jednoduše (a možná více znovupoužitelně) vrátit text pole zde místo toho. Mám podezření na indexování na bigint je mnohem rychlejší než text ale mám problém najít online důkazy, které by to podpořily.

Pro vytvoření indexu:

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

Pro dotazování to funguje a používá index:

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

Toto bude také fungovat pro dotazování, ale nepoužívá index:

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

Aktualizace na verzi 9.4

Postgres 9.4 představil jsonb typ. Toto je dobrá odpověď SO o jsonb a kdy byste jej měli používat přes json . Stručně řečeno, pokud se někdy dotazujete na JSON, měli byste použít jsonb .

Pokud sloupec vytvoříte jako jsonb , můžete použít tento dotaz:

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

@> is Postgres' obsahuje operátor, dokumentováno pro jsonb zde .Díky Alainově odpovědi za to, že jste mě na to upozornili.



  1. Jak spočítám více klíčů ve stejném dotazu $group agregace MongoDB?

  2. Krátké uživatelsky přívětivé ID pro mongo

  3. Spring Mongo DB @DBREF

  4. MongoDB - zkopírujte sbírku v jazyce Java bez opakování všech položek