Práce s JSON ve službě Azure Cosmos DB for NoSQL
PLATÍ PRO: NoSQL
Ve službě Azure Cosmos DB for NoSQL se položky ukládají jako JSON. Systém typů a výrazy jsou omezené tak, aby pracovaly pouze s typy JSON. Další informace najdete ve specifikaci JSON.
Shrneme několik důležitých aspektů práce s JSON:
- Objekty JSON vždy začínají levou složenou
{
závorkou a končí pravou složenou závorkou}
. - Vlastnosti JSON můžete mít vnořené do sebe.
- Hodnoty vlastností JSON můžou být pole.
- V názvech vlastností JSON se rozlišují malá a velká písmena.
- Název vlastnosti JSON může být libovolná řetězcová hodnota (včetně mezer nebo znaků, které nejsou písmeny).
Vnořené vlastnosti
K vnořenému kódu JSON můžete přistupovat pomocí přístupového objektu tečky (.
). Ve svých dotazech můžete použít vnořené vlastnosti JSON stejným způsobem, jakým můžete použít jakékoli jiné vlastnosti.
Tady je dokument s vnořeným kódem JSON:
{
"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
}
}
}
}
V tomto případě jsou všechny sku
vlastnosti a sizes
vlastnosti colors
vnořené do metadata
vlastnosti. Vlastnost name
je také vnořena v rámci manufacturer
vlastnosti.
Tento první příklad projektů tři vnořené vlastnosti.
SELECT
p.manufacturer.name,
p.metadata.sku,
p.metadata.sizes.small.inches AS size
FROM
products p
[
{
"name": "AdventureWorks",
"sku": "72109",
"size": 76
}
]
Práce s poli
Kromě vnořených vlastností podporuje JSON také pole. Při práci s poli můžete získat přístup ke konkrétnímu prvku v rámci pole odkazováním na jeho pozici.
Tento příklad přistupuje k prvku pole na konkrétní pozici.
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"
]
}
]
Ve většině případů ale při práci s poli používáte poddotaz nebo samospojování .
Tady je například dotaz, který vrátí více permutací pomocí potenciálních hodnot pole a křížového spojení.
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"
}
]
Jako další příklad může dotaz použít EXISTS
také s poddotazem.
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"
]
Rozdíl mezi hodnotou null a nedefinovaným
Pokud vlastnost není definována v položce, její hodnota je undefined
. Vlastnost s hodnotou null
musí být explicitně definována a přiřazena null
hodnota.
Azure Cosmos DB for NoSQL podporuje dvě užitečné systémové funkce kontroly typů pro null
a undefined
vlastnosti:
IS_NULL
- zkontroluje, zda jenull
hodnota vlastnosti .IS_DEFINED
- zkontroluje, zda je definována hodnota vlastnosti neboundefined
.
Tady je příklad dotazu, který kontroluje dvě pole pro každou položku v kontejneru.
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
}
]
Další informace o běžných operátorech a jejich chování null
a undefined
hodnotách naleznete v tématu rovnosti a porovnání operátorů.
Vyhrazená klíčová slova a speciální znaky ve formátu JSON
K vlastnostem můžete přistupovat pomocí operátoru []
uvozových vlastností . Například SELECT c.grade
a SELECT c["grade"]
jsou ekvivalentní. Tato syntaxe je užitečná pro řídicí znak vlastnosti, která obsahuje mezery, speciální znaky nebo má stejný název jako klíčové slovo SQL nebo vyhrazené slovo.
Tady je například dotaz, který odkazuje na vlastnost několika různými způsoby.
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"
}
]
Výrazy JSON
Projekce dotazů podporuje výrazy a syntaxi JSON.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"$1": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
V tomto příkladu SELECT
klauzule vytvoří objekt JSON. Vzhledem k tomu, že ukázka neposkytuje žádný klíč, klauzule používá název $<index-number>
implicitní proměnné argumentu .
Tento příklad explicitně pojmenuje stejné pole.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
products p
[
{
"product": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
Případně dotaz může objekt zploštět, aby se zabránilo pojmenování redundantního pole.
SELECT VALUE {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
]
Hodnoty aliasů
V dotazech můžete explicitně aliasovat hodnoty. Pokud má dotaz dvě vlastnosti se stejným názvem, pomocí aliasingu přejmenujte jednu nebo obě vlastnosti, aby byly v předpokládaném výsledku nejednoznačné.
Příklady
AS
Klíčové slovo použité pro aliasing je volitelné, jak je znázorněno v následujícím příkladu.
SELECT
p.name,
p.metadata.sku AS modelNumber
FROM
products p
[
{
"name": "Teapo rainbow surfboard",
"modelNumber": "72109"
}
]
Hodnoty aliasů s vyhrazenými klíčovými slovy nebo speciálními znaky
Aliasing nemůžete použít k promítání hodnoty jako názvu vlastnosti s mezerou, speciálním znakem nebo vyhrazeným slovem. Pokud byste chtěli změnit projekci hodnoty tak, aby měla například název vlastnosti s mezerou , můžete použít výraz JSON.
Tady je příklad:
SELECT VALUE {
"Product's name | ": p.name,
"Model number => ": p.metadata.sku
}
FROM
products p
[
{
"Product's name | ": "Teapo rainbow surfboard",
"Model number => ": "72109"
}
]