sql >> Databasteknik >  >> NoSQL >> MongoDB

Fråga inuti Postgres JSON-matriser

Följande originalsvar gäller endast för Postgres 9.3. För ett Postgres 9.4-svar, se uppdateringen nedan.

Detta bygger på Erwins refererade svar , men är lite mer explicit i denna fråga.

ID:n i det här fallet är bigint s, så skapa en hjälpfunktion för att konvertera en JSON-array till 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 kunde enkelt (och kanske mer återanvändbart) ha returnerat en text array här istället. Jag misstänker indexering på bigint är mycket snabbare än text men jag har svårt att hitta bevis på nätet som styrker det.

För att bygga indexet:

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

För förfrågningar fungerar detta och använder indexet:

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

Att göra detta kommer också att fungera för sökning, men det använder inte index:

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

Uppdatering för 9.4

Postgres 9.4 introducerade jsonb typ. Detta är ett bra SO-svar om jsonb och när du ska använda den över json . Kort sagt, om du någonsin frågar efter JSON, bör du använda jsonb .

Om du bygger din kolumn som jsonb , kan du använda den här frågan:

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

@> är Postgres innehåller operatör, dokumenterad för jsonb här .Tack vare Alains svar för att du uppmärksammade mig på detta.



  1. Mongoid-fråga på hash-fält

  2. Mongodb, sharding och flera fönstertjänster

  3. Konvertera strängarray till objekt-ID-array

  4. mongoose:befolka i mongoose som inte har något ObjectId