NoSQL için Azure Cosmos DB'de JSON ile çalışma
UYGULANANLAR: NoSQL
NoSQL için Azure Cosmos DB'de öğeler JSON olarak depolanır. Tür sistemi ve ifadeleri yalnızca JSON türleriyle çalışacak şekilde kısıtlanmıştır. Daha fazla bilgi için bkz . JSON belirtimi.
JSON ile çalışmanın bazı önemli yönlerini özetleriz:
- JSON nesneleri her zaman bir
{
sol küme ayracı ile başlar ve sağ küme ayracı ile}
biter - İç içe JSON özelliklerine sahip olabilirsiniz
- JSON özellik değerleri diziler olabilir
- JSON özellik adları büyük/küçük harfe duyarlıdır
- JSON özellik adı herhangi bir dize değeri olabilir (harf olmayan boşluklar veya karakterler dahil)
İç içe özellikler
İç içe JSON'a nokta (.
) erişimci kullanarak erişebilirsiniz. Sorgularınızda iç içe JSON özelliklerini, diğer özellikleri kullandığınız gibi kullanabilirsiniz.
İç içe JSON içeren bir belge aşağıdadır:
{
"name": "Teapo rainbow surfboard",
"manufacturer": {
"name": "AdventureWorks"
},
"releaseDate": null,
"metadata": {
"sku": "72109",
"colors": [
"cruise",
"picton-blue"
],
"sizes": {
"small": {
"inches": 76,
"feet": 6.33333
},
"large": {
"inches": 92,
"feet": 7.66667
}
}
}
}
Bu durumda, sku
, colors
ve sizes
özelliklerinin tümü özelliği içinde iç içe yerleştirilmiştir metadata
. name
Özelliği de özelliğin içinde iç içe yerleştirilmiştirmanufacturer
.
Bu ilk örnek üç iç içe özelliği projelendirdi.
SELECT
p.manufacturer.name,
p.metadata.sku,
p.metadata.sizes.small.inches AS size
FROM
products p
[
{
"name": "AdventureWorks",
"sku": "72109",
"size": 76
}
]
Dizilerle çalışma
JSON, iç içe özelliklere ek olarak dizileri de destekler. Dizilerle çalışırken, dizinin içindeki belirli bir öğeye konumuna başvurarak erişebilirsiniz.
Bu örnek, belirli bir konumdaki bir dizi öğesine erişir.
SELECT
p.name,
p.metadata.colors
FROM
products p
WHERE
p.metadata.colors[0] NOT LIKE "%orange%"
[
{
"name": "Teapo rainbow surfboard",
"colors": [
"cruise",
"picton-blue"
]
}
]
Ancak çoğu durumda, dizilerle çalışırken bir alt sorgu veya kendi kendine birleştirme kullanırsınız.
Örneğin, olası dizi değerlerini ve çapraz birleştirmeyi kullanarak birden çok permütasyon döndüren bir sorgu aşağıda verilmiştir.
SELECT
p.name,
c AS color
FROM
products p
JOIN
c IN p.metadata.colors
[
{
"name": "Teapo rainbow surfboard",
"color": "cruise"
},
{
"name": "Teapo rainbow surfboard",
"color": "picton-blue"
}
]
Başka bir örnek olarak, sorgu bir alt sorguyla da kullanılabilir EXISTS
.
SELECT VALUE
p.name
FROM
products p
WHERE
EXISTS (SELECT VALUE
c
FROM
c IN p.metadata.colors
WHERE
c LIKE "%picton%")
[
"Teapo rainbow surfboard"
]
Null ile tanımlanmamış arasındaki fark
Bir öğede bir özellik tanımlanmamışsa değeri olur undefined
. Değeri null
olan bir özellik açıkça tanımlanmalı ve bir null
değer atanmalıdır.
NoSQL için Azure Cosmos DB, ve undefined
özellikleri için null
iki yararlı tür denetimi sistemi işlevini destekler:
IS_NULL
- özellik değerinin olupnull
olmadığını denetler.IS_DEFINED
- bir özellik değerinin veyaundefined
tanımlandığını denetler.
Kapsayıcıdaki her öğede iki alanı denetleyebilen örnek bir sorgu aşağıda verilmiştir.
SELECT
IS_NULL(p.releaseDate) AS isReleaseDateNull,
IS_DEFINED(p.releaseDate) AS isReleaseDateDefined,
IS_NULL(p.retirementDate) AS isRetirementDateNull,
IS_DEFINED(p.retirementDate) AS isRetirementDateDefined
FROM
products p
[
{
"isReleaseDateNull": true,
"isReleaseDateDefined": true,
"isRetirementDateNull": false,
"isRetirementDateDefined": false
}
]
Ortak işleçler ve bunların davranışları ve undefined
değerleri hakkında daha fazla bilgi için null
bkz. eşitlik ve karşılaştırma işleçleri.
JSON'da ayrılmış anahtar sözcükler ve özel karakterler
Teklif edilen özellik işlecini []
kullanarak özelliklere erişebilirsiniz. Örneğin ve SELECT c.grade
SELECT c["grade"]
eşdeğerdir. Bu söz dizimi boşluklar, özel karakterler içeren veya SQL anahtar sözcüğü veya ayrılmış sözcükle aynı ada sahip bir özellikten kaçmak için kullanışlıdır.
Örneğin, bir özelliğe birkaç farklı şekilde başvuran bir sorgu aşağıda verilmiştir.
SELECT
p.manufacturer.name AS dotNotationReference,
p["manufacturer"]["name"] AS bracketReference,
p.manufacturer["name"] AS mixedReference
FROM
products p
[
{
"dotNotationReference": "AdventureWorks",
"bracketReference": "AdventureWorks",
"mixedReference": "AdventureWorks"
}
]
JSON ifadeleri
Sorgu projeksiyonu JSON ifadelerini ve söz dizimlerini destekler.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"$1": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
Bu örnekte yan SELECT
tümcesi bir JSON nesnesi oluşturur. Örnek anahtar sağlamadığından yan tümcesi örtük bağımsız değişken adını $<index-number>
kullanır.
Bu örnek, aynı alanı açıkça adlandıran bir örnektir.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
products p
[
{
"product": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
Alternatif olarak sorgu, yedekli bir alanın adlandırılmasını önlemek için nesneyi düzleştirebilir.
SELECT VALUE {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
]
Diğer ad değerleri
Sorgulardaki değerleri açıkça diğer ad olarak kullanabilirsiniz. Sorgu aynı ada sahip iki özelliğe sahipse, diğer ad kullanarak özelliklerin birini veya her ikisini de yeniden adlandırarak öngörülen sonuçta belirsiz olmasını sağlayın.
Örnekler
Diğer AS
ad için kullanılan anahtar sözcük, aşağıdaki örnekte gösterildiği gibi isteğe bağlıdır.
SELECT
p.name,
p.metadata.sku AS modelNumber
FROM
products p
[
{
"name": "Teapo rainbow surfboard",
"modelNumber": "72109"
}
]
Ayrılmış anahtar sözcükler veya özel karakterler içeren diğer ad değerleri
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, JSON ifadesi kullanabilirsiniz.
Bir örnek aşağıda verilmiştir:
SELECT VALUE {
"Product's name | ": p.name,
"Model number => ": p.metadata.sku
}
FROM
products p
[
{
"Product's name | ": "Teapo rainbow surfboard",
"Model number => ": "72109"
}
]