sql >> Database teknologi >  >> NoSQL >> MongoDB

Forespørgsel inde i Postgres JSON-arrays

Det følgende originale svar gælder kun for Postgres 9.3. For et Postgres 9.4-svar, se opdateringen nedenfor.

Dette bygger på Erwins refererede svar , men er en smule mere eksplicit i forhold til dette spørgsmål.

ID'erne i dette tilfælde er bigint s, så opret en hjælpefunktion til at konvertere et JSON-array til en Postgres bigint array:

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;

Vi kunne bare nemt (og måske mere genbrugeligt) have returneret en tekst række her i stedet. Jeg har mistanke om indeksering på bigint er meget hurtigere end tekst men jeg har svært ved at finde beviser online for at understøtte det.

Til opbygning af indekset:

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

Til forespørgsel virker dette og bruger indekset:

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

At gøre dette vil også fungere til forespørgsler, men det bruger ikke indekset:

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

Opdatering til 9.4

Postgres 9.4 introducerede jsonb type. Dette er et godt SO-svar om jsonb og hvornår du skal bruge det over json . Kort sagt, hvis du nogensinde forespørger på JSON, bør du bruge jsonb .

Hvis du bygger din kolonne som jsonb , kan du bruge denne forespørgsel:

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

@> er Postgres' indeholder operator, dokumenteret for jsonb her .Tak til Alains svar for at gøre mig opmærksom på dette.



  1. Indsæt array, hvor elementet ikke eksisterer, ellers opdatere det (med flere betingelser)

  2. MongoDB Undtagelse:Server rapporterer wire version 0, men version af libmongoc kræver mindst 3

  3. MongoConnectionException - Ingen kandidatservere fundet

  4. Apache-Nifi:Slet MongoDB-samlinger