Sdílet prostřednictvím


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 skuvlastnosti a sizes vlastnosti colorsvnořené do metadata vlastnosti. Vlastnost name je také vnořena v rámci manufacturer vlastnosti.

Tento první příklad projekty 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í 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 je nullhodnota vlastnosti .
  • IS_DEFINED - zkontroluje, zda 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í 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"
  }
]