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 dilinin merkezinde JavaScript Nesne Gösterimi (JSON) ile çalışma vardır. Öğeler JSON olarak depolanır ve tüm sorgular, ifadeler ve türler JSON verileriyle çalışacak şekilde tasarlanmıştır. JSON hakkında daha fazla bilgi için bkz. resmi JSON belirtimi.
Bu bağlamda JSON hakkında bilmeniz gereken bazı önemli şeyler şunlardır:
- JSON nesneleri her zaman ile
{başlar ve ile}biter. - Özellikler birbirinin içinde iç içe yerleştirilebilir.
- Özellik değerleri diziler olabilir.
- Özellik adları büyük/küçük harfe duyarlıdır.
- Özellik adları, boşluklar veya özel karakterlerle bile herhangi bir dize olabilir.
İç içe özellikler
Nokta gösterimini kullanarak iç içe JSON özelliklerine erişebilirsiniz. Bu, çoğu programlama dilindeki özelliklere erişme gibi çalışır.
İşte iç içe JSON içeren örnek bir belge:
[
{
"name": "Heatker Women's Jacket",
"category": "apparel",
"slug": "heatker-women-s-jacket",
"sizes": [
{
"key": "s",
"description": "Small"
}
],
"metadata": {
"link": "https://www.adventure-works.com/heatker-women-s-jacket/68719520138.p"
}
}
]
Ardından sorgularınızda aynı iç içe özellikleri yansıtabilirsiniz:
SELECT
p.name,
p.category,
p.metadata.link
FROM
products p
WHERE
p.name = "Heatker Women's Jacket"
Ve şu beklenen çıkışı elde edersiniz:
[
{
"name": "Heatker Women's Jacket",
"category": "apparel",
"link": "https://www.adventure-works.com/heatker-women-s-jacket/68719520138.p"
}
]
Diziler ve kümeler
JSON dizileri destekler ve sorgularınızda bunlarla çalışabilirsiniz. Belirli bir öğeye erişmek için dizideki konumunu kullanın.
Önceki bölümdeki aynı örneği kullanarak dizinini kullanarak dizideki bir öğeye erişebiliriz. Örneğin, dizideki ilk öğeye erişmek istiyorsak, sorgu dilindeki diziler için sıfır tabanlı bir dizin sistemi olduğundan dizinini kullanırız0:
SELECT
p.name,
p.sizes[0].description AS defaultSize
FROM
products p
WHERE
p.name = "Heatker Women's Jacket"
Bu sorgu aşağıdaki JSON nesnesine neden olur:
[
{
"name": "Heatker Women's Jacket",
"defaultSize": "Small"
}
]
Şimdi daha büyük bir diziye sahip bir örneği ele alalım:
[
{
"name": "Vencon Kid's Coat",
"category": "apparel",
"slug": "vencon-kid-s-coat",
"colors": [
"cardinal",
"disco"
],
"sizes": [
{
"key": "m",
"description": "Medium"
},
{
"key": "l",
"description": "Large"
},
{
"key": "xl",
"description": "Extra Large"
}
]
}
]
Genellikle, bir dizideki tüm öğelerle çalışmak için bir alt sorgu veya kendi kendine birleştirme kullanmak istersiniz. Örneğin, her rengi ayrı bir satır olarak almak için:
SELECT
p.name,
c AS color
FROM
products p
JOIN
c IN p.colors
WHERE
p.name = "Vencon Kid's Coat"
Bu da aşağıdaki gibi bir JSON dizisine neden olur:
[
{
"name": "Vencon Kid's Coat",
"color": "cardinal"
},
{
"name": "Vencon Kid's Coat",
"color": "disco"
}
]
Dizide belirli bir değerin mevcut olup olmadığını denetlemek için, anahtar sözcüğünden sonra filtredeki diziyi WHERE kullanabilirsiniz. Bu örnekte, dizinin öğelerini filtrelemek için bir alt sorgu kullanılır:
SELECT VALUE
p.name
FROM
products p
WHERE
EXISTS(SELECT VALUE
c
FROM
c IN p.sizes
WHERE
c.description LIKE "%Large")
Bu sorgu, örneğindeki öğeyi içeren düz bir JSON dize dizisiyle sonuç verir:
[
...,
"Vencon Kid's Coat"
...
]
Son olarak, birden çok özelliği birleştirerek diziler oluşturabilirsiniz. Bu örnekte, dizi oluşturmak için birden çok özellik birleştirilir metadata :
SELECT
p.name,
[
p.category,
p.slug,
p.metadata.link
] AS metadata
FROM
products p
WHERE
p.name = "Heatker Women's Jacket"
[
{
"name": "Heatker Women's Jacket",
"metadata": [
"apparel",
"heatker-women-s-jacket",
"https://www.adventure-works.com/heatker-women-s-jacket/68719520138.p"
]
}
]
Yineleme
Sorgu dili, kaynaktaki anahtar sözcüğünü kullanarak IN JSON dizileri üzerinde yinelemeyi FROM destekler.
Şu örnek veri kümesini göz önünde bulundurun:
[
{
"name": "Pila Swimsuit",
"colors": [
"regal-blue",
"rose-bud-cherry"
],
"sizes": [
{
"key": "m",
"description": "Medium"
},
{
"key": "l",
"description": "Large"
},
{
"key": "xl",
"description": "Extra Large"
}
]
},
{
"name": "Makay Bikini",
"colors": [
"starship"
],
"sizes": [
{
"key": "s",
"description": "Small"
},
{
"key": "m",
"description": "Medium"
},
{
"key": "l",
"description": "Large"
}
]
}
]
Bu ilk örnek, her ürün için özelliği üzerinde colors yineleme gerçekleştirmek için anahtar sözcüğünü kullanırIN:
SELECT
*
FROM
p IN p.colors
[
"regal-blue",
"rose-bud-cherry",
"starship"
]
Yan tümcesini WHERE kullanarak dizideki tek tek girişleri de filtreleyebilirsiniz. Bu örnekte özelliği sizes filtrelenmiştir:
SELECT
p.key
FROM
p IN p.sizes
WHERE
p.description LIKE "%Large"
[
{
"key": "l"
},
{
"key": "xl"
},
{
"key": "l"
}
]
Aynı IN anahtar sözcüğü kullanarak bir dizi yinelemesinin sonucu üzerinde toplama yapabilirsiniz. Bu örnekte sorgu, kapsayıcıdaki tüm öğeler arasında toplanmış etiketlerin sayısını döndürür:
SELECT VALUE
COUNT(1)
FROM
p IN p.sizes
Uyarı
Yineleme için anahtar sözcüğünü IN kullanırken, dizi dışındaki özellikleri filtreleyemez veya yansıtamazsınız. Bunun yerine , kendi kendine birleşimleri kullanırsınız.
Null ve tanımlanmamış değerler
Belgede bir özellik yoksa değeri olur undefined. Bir özellik varsa ancak olarak nullayarlandıysa, bu açıkça ayarlanmış bir değerdir. ile undefined arasındaki null fark, sorgularda karışıklığa neden olabilecek önemli bir ayrımdır.
Örneğin, özellik hiçbir zaman tanımlanmadığından bu JSON nesnesinin özelliği için sku değeri undefined olacaktır:
[
{
"name": "Witalica helmet",
"category": "gear",
}
]
Özellik henüz bir değerle null ayarlanmadığından bu JSON nesnesinin değeri aynı özellik için olacaktır:
[
{
"name": "Witalica helmet",
"category": "gear",
"sku": null
}
]
Bu durumları denetlemek için yerleşik işlevler vardır:
-
IS_NULLbir özelliğin olupnullolmadığını denetler. -
IS_DEFINEDbir özelliğin var olup olmadığını denetler (değilundefined).
Her ikisini de şu şekilde de kontrol edebilirsiniz:
SELECT
IS_DEFINED(p.sku) AS isSkuDefined,
IS_NULL(p.sku) AS isSkuDefinedButNull
FROM
products p
Köşeli ayraç gösterimi
Çoğu örnek özellikleri belirtmek için noktalı gösterimi kullansa da köşeli ayraç gösterimini kullanarak her zaman aynı özellikleri belirtebilirsiniz.
Şimdi özelliğin değeri metadata olarak iç içe nesne içeren basit bir nesneyle başlayalım:
[
{
"name": "Hikomo Sandals",
"metadata": {
"link": "https://www.adventure-works.com/hikomo-sandals/68719519305.p"
}
}
]
Bu nesne için, nokta ve köşeli ayraç gösterimi birleşimlerini kullanarak özelliğine üç farklı şekilde başvurabilirizmetadata.link:
SELECT
p.metadata.link AS metadataLinkDotNotation,
p["metadata"]["link"] AS metadataLinkBracketNotation,
p.metadata["link"] AS metadataLinkMixedNotation
FROM
products p
WHERE
p.name = "Hikomo Sandals"
[
{
"metadataLinkDotNotation": "https://www.adventure-works.com/hikomo-sandals/68719519305.p",
"metadataLinkBracketNotation": "https://www.adventure-works.com/hikomo-sandals/68719519305.p",
"metadataLinkMixedNotation": "https://www.adventure-works.com/hikomo-sandals/68719519305.p"
}
]
İpucu
Özellik adında boşluklar, özel karakterler varsa veya ayrılmış bir sözcükle eşleşiyorsa, özelliği belirtmek için köşeli ayraç gösterimi kullanmanız gerekir.
JSON ifadeleri
JSON nesnelerini doğrudan sorgu sonuçlarınızda oluşturabilirsiniz. Örnek olarak bu JSON dizisiyle başlayalım:
[
{
"name": "Diannis Watch",
"category": "apparel",
"detailCategory": "apparel-accessories-watches",
"slug": "diannis-watch",
"sku": "64801",
"price": 98,
"quantity": 159
},
{
"name": "Confira Watch",
"category": "apparel",
"detailCategory": "apparel-accessories-watches",
"slug": "confira-watch",
"sku": "64800",
"price": 105,
"quantity": 193
}
]
En basit söz dizimini kullanarak, bir NoSQL sorgusunda açılı ayraçlar ({/}) ve eklenmiş JSON söz dizimini kullanarak göreli olarak düz bir JSON nesnesinin özellik adlarını etkileyebilirsiniz:
SELECT {
"brandName": p.name,
"department": p.category
}
FROM
products p
WHERE
p.detailCategory = "apparel-accessories-watches"
[
{
"$1": {
"brandName": "Diannis Watch",
"department": "apparel"
}
},
{
"$1": {
"brandName": "Confira Watch",
"department": "apparel"
}
}
]
Önceki örnekte, açık bir ad tanımlanmadığı için sonucun $1 çıkarım adı vardı. Bu sonraki örnekte, sonuç bir diğer ad kullanılarak tanımlanan açık bir ada product sahiptir:
SELECT {
"brandName": p.name,
"department": p.category
} AS product
FROM
products p
WHERE
p.detailCategory = "apparel-accessories-watches"
[
{
"product": {
"brandName": "Diannis Watch",
"department": "apparel"
}
},
{
"product": {
"brandName": "Confira Watch",
"department": "apparel"
}
}
]
Alternatif olarak, sonuç bir SELECT VALUE deyimdeki VALUE anahtar sözcük kullanılarak düzleştirilebilir:
SELECT VALUE {
"brandName": p.name,
"department": p.category
}
FROM
products p
WHERE
p.detailCategory = "apparel-accessories-watches"
[
{
"brandName": "Diannis Watch",
"department": "apparel"
},
{
"brandName": "Confira Watch",
"department": "apparel"
}
]
Daha da ileri giderek, JSON söz dizimini kullanarak sonuç JSON nesnesini özgün öğede açıkça tanımlanmayabilecek dizileri, alt nesneleri ve diğer JSON yapılarını içerecek şekilde "yeniden şekillendirebilirsiniz". bu teknik, istemci uygulaması temel alınan veriyle eşleşmeyen belirli bir şemada veri bekliyorsa kullanışlıdır.
Bu JSON şemasını göz önünde bulundurun, örneğin:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"id",
"category",
"financial"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"category": {
"type": "object",
"properties": {
"department": {
"type": "string"
},
"section": {
"type": "string"
}
},
"required": [
"department"
]
},
"inventory": {
"type": "object",
"properties": {
"stock": {
"type": "number"
}
}
},
"financial": {
"type": "object",
"properties": {
"listPrice": {
"type": "number"
}
},
"required": [
"listPrice"
]
}
}
}
Bu şema, şu biçimde yapılandırılmış bir JSON nesnesine izin verir:
[
{
"id": "[string]",
"name": "[string]",
"category": {
"department": "[string]",
"section": "[string]"
},
"inventory": {
"stock": [number]
},
"financial": {
"listPrice": [number]
}
}
]
Bu NoSQL sorgusu, özgün nesneyi[s] bu yeni şemayla uyumlu olacak şekilde yeniden eşler:
SELECT VALUE {
"id": p.sku,
"name": p.name,
"category": {
"department": p.category,
"section": p.detailCategory
},
"inventory": {
"stock": p.quantity
},
"financial": {
"listPrice": p.price
}
}
FROM
products p
WHERE
p.detailCategory = "apparel-accessories-watches"
[
{
"id": "64801",
"name": "Diannis Watch",
"category": {
"department": "apparel",
"section": "apparel-accessories-watches"
},
"inventory": {
"stock": 159
},
"financial": {
"listPrice": 98
}
},
{
"id": "64800",
"name": "Confira Watch",
"category": {
"department": "apparel",
"section": "apparel-accessories-watches"
},
"inventory": {
"stock": 193
},
"financial": {
"listPrice": 105
}
}
]
Kapsayıcı diğer adları
Varsayılan olarak, anahtar sözcüğünden FROM sonra kullanılan terim sorgunun hedefi olan kapsayıcıya başvurur. Terimin kendisi, kapsayıcının adıyla eşleşmesi için DEĞİlDİr .
Örneğin, kapsayıcının adı productsise, bu sorgulardan herhangi biri sorunsuz çalışır ve bu kapsayıcı sorgunun hedefi olduğu sürece kapsayıcıya başvururproducts:
SELECT
products.id
FROM
products
SELECT
p.id
FROM
p
SELECT
items.id
FROM
items
SELECT
targetContainer.id
FROM
targetContainer
NoSQL sorgunuzu daha kısa hale getirmek için kapsayıcı adını daha kısa bir adla adlandırmak yaygın bir seçenektir. Diğer ad oluşturma şu anahtar sözcük kullanılarak AS yapılabilir:
SELECT
p.id
FROM
products AS p
Sorgu dilinin, diğer adın anahtar sözcük olmadan hedef kapsayıcı başvurusundan hemen sonra tanımlanabildiği AS bir kısaltma söz dizimi de vardır. Bu kısaltma işlev olarak anahtar sözcüğünü AS kullanmaya eşdeğerdir:
SELECT
p.id
FROM
products p
Özellik diğer adları
Sonuçlarınızdaki alanları aynı AS anahtar sözcükle tanımlarken diğer adlar kullanarak da yeniden adlandırabilirsiniz. Sonraki birkaç örnek için şu örnek verileri göz önünde bulundurun:
[
{
"name": "Oceabelle Scarf",
"detailCategory": "apparel-accessories-scarfs-and-socks",
"metadata": {
"link": "https://www.adventure-works.com/oceabelle-scarf/68719522190.p"
}
},
{
"name": "Shinity Socks",
"detailCategory": "apparel-accessories-scarfs-and-socks",
"metadata": {
"link": "https://www.adventure-works.com/shinity-socks/68719522161.p"
}
},
{
"name": "Horric Socks",
"detailCategory": "apparel-accessories-scarfs-and-socks",
"metadata": {
"link": "https://www.adventure-works.com/horric-socks/68719522177.p"
}
}
]
Bu ilk örnekte, özelliğin metadataLink değeri için metadata.link diğer ad kullanılır:
SELECT
p.name,
p.metadata.link AS metadataLink
FROM
products p
[
{
"name": "Oceabelle Scarf",
"metadataLink": "https://www.adventure-works.com/oceabelle-scarf/68719522190.p"
},
{
"name": "Shinity Socks",
"metadataLink": "https://www.adventure-works.com/shinity-socks/68719522161.p"
},
{
"name": "Horric Socks",
"metadataLink": "https://www.adventure-works.com/horric-socks/68719522177.p"
}
]
Önemli
Bir değeri boşluk, özel karakter veya ayrılmış sözcükle özellik adı olarak yansıtmak için diğer ad kullanamazsınız. Örneğin, bir değerin yansıtmasını boşluklu bir özellik adıyla değiştirmek istiyorsanız, bir JSON ifadesi kullanmanız gerekir.
Örneğin
SELECT VALUE {
"product name": p.name,
"from": p.metadata.link,
"detail/category": p.detailCategory
}
FROM
products p
WHERE
p.detailCategory = "apparel-accessories-scarfs-and-socks"
[
{
"product name": "Oceabelle Scarf",
"from": "https://www.adventure-works.com/oceabelle-scarf/68719522190.p",
"detail/category": "apparel-accessories-scarfs-and-socks"
},
{
"product name": "Shinity Socks",
"from": "https://www.adventure-works.com/shinity-socks/68719522161.p",
"detail/category": "apparel-accessories-scarfs-and-socks"
},
{
"product name": "Horric Socks",
"from": "https://www.adventure-works.com/horric-socks/68719522177.p",
"detail/category": "apparel-accessories-scarfs-and-socks"
}
]
NoSQL sorgusu aynı ada sahip iki özelliğe sahipse, diğer adları kullanarak özelliklerin birini veya her ikisini de yeniden adlandırarak öngörülen sonuçta belirsiz olmasını sağlayın.
Bu örnek verileri göz önünde bulundurun:
[
{
"name": "Oceabelle Scarf",
"detailCategory": "apparel-accessories-scarfs-and-socks",
"sizes": [
{
"key": "s"
},
...
],
"tags": [
...
]
},
{
"name": "Shinity Socks",
"detailCategory": "apparel-accessories-scarfs-and-socks",
"sizes": [
...
{
"key": "10"
},
...
],
"tags": [
...
{
"key": "length"
}
]
},
{
"name": "Horric Socks",
"detailCategory": "apparel-accessories-scarfs-and-socks",
"sizes": [
...
{
"key": "7"
},
...
],
"tags": [
{
"key": "fabric"
},
...
]
}
]
Uyarı
Bu örnek verilerde ve sorgu sonucunda, kısa süre için birden çok özellik ve değer kaldırıldı.
Bu NoSQL sorgusu, çapraz ürün sonucundaki ve p.tags[].key özelliklerini döndürürp.sizes[].key, ancak çakışmaları önlemek için her key özelliğin diğer adını verir:
SELECT
p.name,
s.key AS sizeKey,
t.key AS tagKey
FROM
products p
JOIN
s IN p.sizes
JOIN
t in p.tags
WHERE
p.detailCategory = "apparel-accessories-scarfs-and-socks"
[
{
"name": "Oceabelle Scarf",
"sizeKey": "s",
"tagKey": "fabric"
},
...
{
"name": "Shinity Socks",
"sizeKey": "10",
"tagKey": "length"
},
...
{
"name": "Horric Socks",
"sizeKey": "7",
"tagKey": "fabric"
}
]