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 sku
właściwości , colors
i 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 tonull
.IS_DEFINED
— sprawdza, czy wartość właściwości jest zdefiniowana lubundefined
.
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"
}
]