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ěkteré důležité aspekty 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é mezi sebou.
  • 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á hodnota řetězce (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 s tečkou (.). Vnořené vlastnosti JSON můžete v dotazech použít stejným způsobem jako 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ě skujsou vlastnosti , colorsa sizes vnořené ve metadata vlastnosti . Vlastnost name je také vnořená do vlastnosti manufacturer .

Tento první příklad projektuje dvě vnořené vlastnosti.

SELECT
    p.name,
    p.metadata.sku,
    p.sizes.small.inches AS size
FROM
    products p
[
  {
    "name": "Teapo rainbow surfboard",
    "sku": "72109"
  }
]

Práce s poli

Kromě vnořených vlastností JSON podporuje 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žijete poddotaz nebo spojení sama sebe.

Tady je například dotaz, který vrací 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 by dotaz mohl 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ými hodnotami

Pokud vlastnost není definovaná v položce, její hodnota je undefined. Vlastnost s hodnotou null musí být explicitně definována a přiřazena hodnota null .

Azure Cosmos DB for NoSQL podporuje dvě užitečné systémové funkce kontroly typů pro null vlastnosti a undefined :

  • IS_NULL – zkontroluje, jestli je nullhodnota vlastnosti .
  • IS_DEFINED – zkontroluje, jestli je definována hodnota vlastnosti nebo undefined.

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í pro null hodnoty a undefined najdete v tématu Operátory rovnosti a porovnání.

Vyhrazená klíčová slova a speciální znaky ve formátu JSON

K vlastnostem můžete přistupovat pomocí operátoru []vlastnosti v uvozovávce . Například SELECT c.grade a SELECT c["grade"] jsou ekvivalentní. Tato syntaxe je užitečná k uvozování vlastnosti, která obsahuje mezery nebo speciální znaky nebo má stejný název jako klíčové slovo SQL nebo rezervované 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 klauzule SELECT vytvoří objekt JSON. Vzhledem k tomu, že ukázka neposkytuje žádný klíč, klauzule používá implicitní název $<index-number>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ě může dotaz 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í aliasů přejmenujte jednu nebo obě vlastnosti, aby byly v předpokládaném výsledku nejednoznačné.

Příklady

Klíčové AS slovo používané 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 rezervovanými klíčovými slovy nebo speciálními znaky

Aliasing nemůžete použít k promítnutí hodnoty jako názvu vlastnosti s mezerou, speciálním znakem nebo vyhrazeným slovem. Pokud byste chtěli změnit projekci hodnoty, aby například měla 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"
  }
]