Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sorgu dilinde veriler şemasızdır ve normalde normal dışıdır. İlişkisel veritabanında yaptığınız gibi varlıklar ve kümeler arasında verileri birleştirmek yerine birleştirmeler tek bir öğe içinde gerçekleşir. Özellikle birleşimlerin kapsamı bu öğeye göre belirlenmiştir ve birden çok öğe ve kapsayıcıda gerçekleşemez.
İpucu
Kendinizi öğeler ve kapsayıcılar arasında birleştirmeniz gerektiğini düşünüyorsanız, bu anti-deseni önlemek için veri modelinizi yeniden kullanmayı göz önünde bulundurun.
Tek bir öğeyle kendi kendine birleştirme
Şimdi bir öğe içinde kendi kendine birleştirme örneğine bakalım. Tek öğeli bir kapsayıcı düşünün. Bu öğe, çeşitli boyutlara sahip bir ürünü temsil eder:
[
{
"name": "Raiot Jacket",
"sizes": [
{
"key": "s",
"description": "Small"
},
{
"key": "m",
"description": "Medium"
},
{
"key": "l",
"description": "Large"
},
{
"key": "xl",
"description": "Extra Large"
}
]
}
]
Belirli bir boyuta sahip ürünleri bulmanız gerekiyorsa ne yapmanız gerekir? Genellikle, dizideki tüm olası dizinlerde sizes ön ek içeren bir değer için filtre denetimi olan bir sorgu yazmanız gerekir. Bu örnekte sorgu, ile biten Largeboyuta sahip tüm ürünleri bulur:
SELECT
*
FROM
products p
WHERE
p.sizes[0].description LIKE "%Large" OR
p.sizes[1].description LIKE "%Large" OR
p.sizes[2].description LIKE "%Large" OR
p.sizes[3].description LIKE "%Large"
Bu teknik hızlı bir şekilde engellenemez hale gelebilir. Sorgu söz diziminin karmaşıklığı veya uzunluğu dizideki olası öğelerin sayısını artırır. Ayrıca bu sorgu, gelecekte üçten fazla boyuta sahip olabilecek ürünleri işlemek için yeterince esnek değildir.
Geleneksel bir ilişkisel veritabanında, boyutlar ayrı bir tabloya ayrılır ve sonuçlara uygulanan bir filtre ile tablolar arası birleştirme gerçekleştirilir. Sorgu dilinde, anahtar sözcüğünü kullanarak JOIN öğe içinde kendi kendine birleştirme işlemi gerçekleştirebiliriz:
SELECT
p.name,
s.key,
s.description
FROM
products p
JOIN
s in p.sizes
Bu sorgu, etiketler dizisindeki her değer için bir öğe içeren basit bir dizi döndürür.
[
{
"name": "Raiot Jacket",
"key": "s",
"description": "Small"
},
{
"name": "Raiot Jacket",
"key": "m",
"description": "Medium"
},
{
"name": "Raiot Jacket",
"key": "l",
"description": "Large"
},
{
"name": "Raiot Jacket",
"key": "xl",
"description": "Extra Large"
}
]
Şimdi sorguyu bölelim. Sorgunun artık iki diğer adı vardır: p sonuç kümesindeki her ürün öğesi için ve s kendi kendine birleştirilen sizes dizi için. Anahtar * sözcüğü yalnızca giriş kümesini çıkarsayabiliyorsa tüm alanları yansıtmak için geçerlidir, ancak şimdi iki giriş kümesi (p ve t) vardır. Bu kısıtlama nedeniyle, döndürülen alanlarımızı ile birlikte keyüründen ve description boyutlarından olarak name açıkça tanımlamamız gerekir.
Son olarak, ile Largebiten boyutları bulmak için bir filtre kullanabiliriz. Anahtar sözcüğünü kullandığımızdan JOIN , filtremiz değişken sayıda etiketi işleyecek kadar esnektir:
SELECT
p.name,
s.key AS size
FROM
products p
JOIN
s in p.sizes
WHERE
s.description LIKE "%Large"
[
{
"name": "Raiot Jacket",
"size": "l"
},
{
"name": "Raiot Jacket",
"size": "xl"
}
]
Birden çok öğeyi kendi kendine birleştirme
Şimdi birden çok öğede bulunan bir dizi içinde bir değer bulmamız gereken bir örneğe geçelim. Bu örnekte, iki ürün öğesi içeren bir kapsayıcı düşünün. Her öğe bu öğeyle ilgilidir colors .
[
{
"name": "Gremon Fins",
"colors": [
"science-blue",
"turbo"
]
},
{
"name": "Elecy Jacket",
"colors": [
"indigo-shark",
"jordy-blue-shark"
]
},
{
"name": "Tresko Pack",
"colors": [
"golden-dream"
]
}
]
Adında bir renk bulunan blue her öğeyi bulmanız gerekirse ne olur? dizesini blueel ile arayabilirsiniz, ancak bu öğelerin iki özelliğini hesaplayan karmaşık bir sorgu yazmanız gerekir:
Alt dize içeren
bluerenkler her dizideki farklı dizinlerde gerçekleşir. Ürün içinElecy Jacketrenk ikinci öğedir (dizin:1). Ürün içinGremon Finsetiket ilk öğedir (dizin:0). ÜründeTresko Packbu alt dizeyi içeren bir ürün yoktur.colorsHer öğenin dizisi farklı bir uzunluktadır. veElecy JacketürünlerininGremon Finsher ikisi de iki renge sahipkenTresko Pack, ürünün yalnızca bir rengi vardır.
Burada anahtar sözcük, JOIN öğelerin ve renklerin çapraz bir ürününü oluşturmak için harika bir araçtır. Birleşimler, birleştirmeye katılan kümelerin tam bir çapraz ürününü oluşturur. Sonuç, öğenin her permütasyonunu ve hedeflenen dizideki değerleri içeren bir demet kümesidir.
Örnek ürünlerimizde ve renklerimizde birleştirme işlemi aşağıdaki öğeleri oluşturur:
| Ürün | Renk |
|---|---|
Gremon Fins |
science-blue |
Gremon Fins |
turbo |
Elecy Jacket |
indigo-shark |
Elecy Jacket |
jordy-blue-shark |
Tresko Pack |
golden-dream |
Bu örnek NoSQl sorgusu, çapraz ürün oluşturmak için anahtar sözcüğünü JOIN kullanır ve tüm permütasyonları döndürür:
SELECT
p.name,
c AS color
FROM
products p
JOIN
c in p.colors
[
{
"name": "Elecy Jacket",
"color": "indigo-shark"
},
{
"name": "Elecy Jacket",
"color": "jordy-blue-shark"
},
{
"name": "Gremon Fins",
"color": "science-blue"
},
{
"name": "Gremon Fins",
"color": "turbo"
},
{
"name": "Tresko Pack",
"color": "golden-dream"
}
]
Tek öğede olduğu gibi, yalnızca belirli bir etiketle eşleşen öğeleri bulmak için buraya filtre uygulayabilirsiniz. Örneğin, bu sorgu, bu bölümün önceki bölümlerinde belirtilen ilk gereksinimi karşılamak için içeren blue bir alt dizeye sahip tüm öğeleri bulur.
SELECT
p.name,
c AS color
FROM
products p
JOIN
c in p.colors
WHERE
c LIKE "%blue%"
[
{
"name": "Elecy Jacket",
"color": "jordy-blue-shark"
},
{
"name": "Gremon Fins",
"color": "science-blue"
}
]
Bu sorgu, yalnızca filtreyi karşılayan ürünlerin adlarını döndürmek için daha da iyileştirilebilir. Bu örnek renk değerlerini yansıtmaz, ancak filtre yine de beklendiği gibi çalışır:
SELECT VALUE
p.name
FROM
products p
JOIN
c in p.colors
WHERE
c LIKE "%blue%"
[
"Elecy Jacket",
"Gremon Fins"
]