MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Membuat kueri di dalam array JSON Postgres

Jawaban asli berikut hanya berlaku untuk Postgres 9.3. Untuk jawaban Postgres 9.4, lihat Pembaruan di bawah.

Ini didasarkan pada jawaban referensi Erwin , tetapi sedikit lebih eksplisit untuk pertanyaan ini.

ID dalam hal ini adalah bigint s, jadi buat fungsi pembantu untuk mengonversi larik JSON menjadi bigint Postgres susunan:

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;

Kita bisa saja dengan mudah (dan mungkin lebih dapat digunakan kembali) mengembalikan text array di sini sebagai gantinya. Saya menduga pengindeksan pada bigint jauh lebih cepat daripada text tapi saya kesulitan menemukan bukti online untuk mendukungnya.

Untuk membangun indeks:

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

Untuk kueri, ini berfungsi dan menggunakan indeks:

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

Melakukan ini juga akan berfungsi untuk kueri, tetapi tidak menggunakan indeks:

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

Pembaruan untuk 9,4

Postgres 9.4 memperkenalkan jsonb Tipe. Ini adalah jawaban SO yang bagus tentang jsonb dan kapan Anda harus menggunakannya di atas json . Singkatnya, jika Anda pernah menanyakan JSON, Anda harus menggunakan jsonb .

Jika Anda membuat kolom sebagai jsonb , Anda dapat menggunakan kueri ini:

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

@> adalah Postgres' berisi operator, didokumentasikan untuk jsonb di sini .Terima kasih kepada Jawaban Alain untuk membawa ini menjadi perhatian saya.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara Mendapatkan Hari, Bulan, dan Tahun dari Tanggal di SQL

  2. membuat logika di dalam Spring Batch menggunakan Tasklet atau di dalam CompositeItemWriter?

  3. Alternatif untuk iterasi kursor Pymongo

  4. Hanya ekspos bidang tertentu saat melihat item tertentu dengan Data Musim Semi?

  5. 10 fitur teratas dari MongoDB Atlas