NoSQL için Azure Cosmos DB'de JSON ile çalışma
ŞUNUN IÇIN GEÇERLIDIR: 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 özetledik:
- JSON nesneleri her zaman 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
nokta (.
) erişimci kullanarak iç içe JSON'a 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 metadata
iç içe yerleştirilmiştir. name
özelliği de özelliğin içinde iç içe yerleştirilmiştirmanufacturer
.
Bu ilk örnek, iç içe iki özelliği projelendirdi.
SELECT
p.name,
p.metadata.sku,
p.sizes.small.inches AS size
FROM
products p
[
{
"name": "Teapo rainbow surfboard",
"sku": "72109"
}
]
Dizilerle çalışma
İç içe özelliklere ek olarak, JSON dizileri de destekler. Dizilerle çalışırken, dizi 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şim kullanırsınız.
Örneğin, olası dizi değerlerini ve çapraz birleştirmeyi kullanarak birden çok permütasyon döndüren bir sorgu 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 sorgu ile de 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ımsız 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 sistem işlevini destekler:
IS_NULL
- bir özellik değerinin olupnull
olmadığını denetler.IS_DEFINED
- bir özellik değerinin veyaundefined
tanımlandığını denetler.
Aşağıda, kapsayıcıdaki her öğede iki alanı denetleyebilen örnek bir sorgu 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 ve undefined
değerlerine yönelik davranışları 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
Tırnak içine alınmış ö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çış yapmak için kullanışlıdır.
Örneğin, bir özelliğe birkaç farklı yoldan 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 tümcesi SELECT
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ırın.
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 gereksiz 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. Bir sorgunun aynı ada sahip iki özelliği varsa, öngörülen sonuçta belirsiz olmaları için özelliklerin birini veya her ikisini yeniden adlandırmak için diğer ad kullanın.
Örnekler
AS
Aşağıdaki örnekte gösterildiği gibi diğer ad için kullanılan anahtar sözcük 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 isterseniz JSON ifadesi kullanabilirsiniz.
Aşağıda bir örnek 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"
}
]