Praca z plikiem JSON w usłudze Azure Cosmos DB for NoSQL

DOTYCZY: NoSQL

W usłudze Azure Cosmos DB for NoSQL elementy są przechowywane jako dane JSON. System typów i wyrażenia są ograniczone do obsługi tylko typów JSON. Aby uzyskać więcej informacji, zobacz specyfikację JSON.

Podsumujemy niektóre ważne aspekty pracy z plikiem JSON:

  • Obiekty JSON zawsze zaczynają się od lewego nawiasu { klamrowego i kończą się prawym nawiasem } klamrowym
  • Właściwości JSON można zagnieżdżać w obrębie siebie
  • Wartości właściwości JSON mogą być tablicami
  • Nazwy właściwości JSON są uwzględniane w wielkości liter
  • Nazwa właściwości JSON może być dowolną wartością ciągu (w tym spacjami lub znakami, które nie są literami)

Właściwości zagnieżdżone

Dostęp do zagnieżdżonego kodu JSON można uzyskać przy użyciu metody dostępu kropkowego (.). W zapytaniach można używać zagnieżdżonych właściwości JSON w taki sam sposób, jak w przypadku innych właściwości.

Oto dokument z zagnieżdżonym kodem 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
      }
    }
  }
}

W tym przypadku skuwłaściwości , colorsi sizes są zagnieżdżone we metadata właściwości . Właściwość name jest również zagnieżdżona w obrębie manufacturer właściwości.

W tym pierwszym przykładzie są projektowane dwie zagnieżdżone właściwości.

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

Praca z tablicami

Oprócz właściwości zagnieżdżonych kod JSON obsługuje również tablice. Podczas pracy z tablicami można uzyskać dostęp do określonego elementu w tablicy, odwołując się do jego położenia.

W tym przykładzie uzyskuje dostęp do elementu tablicy w określonej pozycji.

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"
    ]
  }
]

W większości przypadków jednak podczas pracy z tablicami należy użyć podquery lub samosprzężenia .

Na przykład oto zapytanie zwracające wiele permutacji przy użyciu potencjalnych wartości tablicy i sprzężenia krzyżowego,

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"
  }
]

Innym przykładem może być również EXISTS użycie zapytania z podquerią.

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"
]

Różnica między wartością null a niezdefiniowaną

Jeśli właściwość nie jest zdefiniowana w elemencie, jego wartość to undefined. Właściwość o wartości null musi być jawnie zdefiniowana i przypisana null wartość.

Usługa Azure Cosmos DB for NoSQL obsługuje dwie przydatne funkcje systemowe sprawdzania typów dla null właściwości i undefined :

  • IS_NULL - sprawdza, czy wartość właściwości to null.
  • IS_DEFINED — sprawdza, czy wartość właściwości jest zdefiniowana lub undefined.

Oto przykładowe zapytanie sprawdzające dwa pola w każdym elemencie w kontenerze.

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
  }
]

Aby uzyskać więcej informacji o typowych operatorach i ich zachowaniu dla null i undefined wartości, zobacz operatory równości i porównania.

Zastrzeżone słowa kluczowe i znaki specjalne w formacie JSON

Dostęp do właściwości można uzyskać za pomocą operatora []właściwości cytowanej . Na przykład elementy SELECT c.grade i SELECT c["grade"] są równoważne. Ta składnia jest przydatna do ucieczki właściwości zawierającej spacje, znaki specjalne lub ma taką samą nazwę jak słowo kluczowe SQL lub słowo zarezerwowane.

Na przykład oto zapytanie, które odwołuje się do właściwości na kilka różnych sposobów.

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"
  }
]

Wyrażenia JSON

Projekcja zapytań obsługuje wyrażenia JSON i składnię.

SELECT {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
    products p
[
  {
    "$1": {
      "productName": "Teapo rainbow surfboard",
      "largeSizeInFeet": 7.66667
    }
  }
]

W tym przykładzie klauzula SELECT tworzy obiekt JSON. Ponieważ przykład nie udostępnia klucza, klauzula używa niejawnej nazwy $<index-number>zmiennej argumentu .

W tym przykładzie jawnie nazywa się to samo pole.

SELECT {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
    products p
[
  {
    "product": {
      "productName": "Teapo rainbow surfboard",
      "largeSizeInFeet": 7.66667
    }
  }
]

Alternatywnie zapytanie może spłaszczać obiekt, aby uniknąć nazewnictwa nadmiarowego pola.

SELECT VALUE {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
    products p
[
  {
    "productName": "Teapo rainbow surfboard",
    "largeSizeInFeet": 7.66667
  }
]

Wartości aliasu

Możesz jawnie aliasować wartości w zapytaniach. Jeśli zapytanie ma dwie właściwości o tej samej nazwie, użyj aliasu, aby zmienić nazwę jednej lub obu właściwości, aby były one niejednoznaczne w przewidywanym wyniku.

Przykłady

Słowo AS kluczowe używane do aliasowania jest opcjonalne, jak pokazano w poniższym przykładzie.

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

Wartości aliasu z zastrzeżonymi słowami kluczowymi lub znakami specjalnymi

Nie można używać aliasów do tworzenia wartości jako nazwy właściwości z spacją, znakiem specjalnym lub słowem zarezerwowanym. Jeśli na przykład chcesz zmienić projekcję wartości, aby mieć nazwę właściwości z spacją, możesz użyć wyrażenia JSON.

Oto przykład:

SELECT VALUE {
    "Product's name | ": p.name,
    "Model number => ": p.metadata.sku
}
FROM
    products p
[
  {
    "Product's name | ": "Teapo rainbow surfboard",
    "Model number => ": "72109"
  }
]