Builder

web application developer blog

Hybrit Data Model 2. Bölüm: PostgreSQL’de JSON sorguları

Hibrit Datamodelin ne olduğuna dair daha önceki yazımı kaçıranlar şuradan başlayabilirler. Bu yazımda kullandığım örneklerde, öncekinden farklı olarak JSONB veri tipi var. JSONB Postgresql’de Binary JSON veri tipidir ve 9.4 versiyonundan itibaren desteklenmektedir.

Hibrit Datamodel’de JSON sorgusu örneklerine başlamadan önce, örnek bir tablomuz olması lazım:

Bir de bu tabloda sql sorguları yapabileceğimiz örnek kayıtlara ihtiyacımız var.

Üç telefon kaydımız var. Bu telefonların örnek özellikleri ve alternatif isimleri var. Bunlar JSON formatında ve JSONB veri türünde. Şimdi SQL ile sorgulamaya başlayalım. İlk önce basit bir SQL sorgusu:

 

PostgreSQL JSONB karşılaştırma Sorgusu:

RAM’i 2 GB dan büyük olanlar

Sonuç:

product_name
Samsung Galaxy Note 5 Cep Telefonu

PostgreSQL JSONB İçeren Sorgusu:

Kameralarından birisi “arka stereo” olanlar:

Burada içeren sorgusu yazılırken, (tbl_product.attributes->>’kameralar’)::jsonb seçimi ile elde edilen yeni json verisinde ‘[“arka stereo”]’::jsonb ile belittiğimiz sring dizisi var mıdır? şeklinde bir sorgu oluşuyor.

Sonuç:

product_name
HTC One M8 Cep Telefonu

PostgreSQL JSONB Gelişmiş İçeren Sorgusu

Ürünün synonymleri arasından herhangi birisinin slug’ı “one m8 16gb gray” yada “htc one m8 16gb gray” olanlar:

Burada iki diziyi kesiştirip, kesişiminde bir eleman olup olmadığı sorgulanacaktır. Dikkat edilmesi gereken nokta json içinde arama yapılırken, aranan json’ın da aynı yapıda olması. Burada synonyms bir dizi olduğu için aranan her bir slug önce bir dizi ardında bir nesne yapısında yazılmıştır.

Sonuç:

product_name
HTC One M8 Cep Telefonu

PostgreSQL JSONB Regex’li İçeren Sorgusu

Ürün synonym’i “note” yada “one” kelimesini içerenler:

Burada kelime bazlı bir arama yaptığımız için anahtar kelimelerin başına ve sonunda boşluk olmalı yada anahtar kelime cümlenin başında veya sonunda ise tek bir yanında boşluk olmalı. Aksi taktirde “iphone” kelimesi de “one” kelimesini içerdiği için bu sorguya yakalancaktır.

Sonuç:

product_name
Samsung Galaxy Note 5 Cep Telefonu
HTC One M8 Cep Telefonu

PostgreSQL JSONB iki dizinin kesişimini sorgulamak

Kamera dizisi ile  “Ön”,”Arka”,”Arka Stereo” verilerinden  en az birisi ortak olanlar:

Bu işlemi yapabilmek için bir fonksiyon tanımlaması yapmamız gerekiyor.

Bu fonksiyon, postgresql’in standart fonksiyonları tarafından şimdilik yapılamayan, json => array dönüşümünü yapıyor.

Şimdi sorgumuzu yazacak olursak:

Sonuç:

product_name
Apple iPhone 6S 16GB Cep Telefonu
Samsung Galaxy Note 5 Cep Telefonu
HTC One M8 Cep Telefonu

 

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir