MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Abfragen innerhalb von Postgres-JSON-Arrays

Die folgende ursprüngliche Antwort gilt nur für Postgres 9.3. Eine Antwort auf Postgres 9.4 finden Sie im Update unten.

Dies baut auf Erwins referenzierten Antworten auf , geht aber etwas expliziter auf diese Frage ein.

Die IDs sind in diesem Fall bigint s, erstellen Sie also eine Hilfsfunktion zum Konvertieren eines JSON-Arrays in ein 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;

Wir hätten einfach (und vielleicht besser wiederverwendbar) einen text zurückgeben können Array stattdessen hier. Ich vermute die Indizierung auf bigint ist viel schneller als text aber es fällt mir schwer, online Beweise dafür zu finden.

Zum Erstellen des Indexes:

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

Für Abfragen funktioniert dies und verwendet den Index:

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

Dies funktioniert auch für Abfragen, verwendet jedoch nicht den Index:

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

Update für 9.4

Postgres 9.4 hat den jsonb eingeführt Typ. Dies ist eine gute SO-Antwort zu jsonb und wann Sie es über json verwenden sollten . Kurz gesagt, wenn Sie jemals JSON abfragen, sollten Sie jsonb verwenden .

Wenn Sie Ihre Spalte als jsonb erstellen , können Sie diese Abfrage verwenden:

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

Der @> ist der Contains-Operator von Postgres, dokumentiert für jsonb hier .Dank an Alains Antwort dass Sie mich darauf aufmerksam gemacht haben.