Arbeiten mit JSON in Azure Cosmos DB for NoSQL
GILT FÜR: NoSQL
In Azure Cosmos DB for NoSQL werden Elemente als JSON gespeichert. Typsystem und Ausdrücke sind auf JSON-Typen beschränkt. Weitere Informationen finden Sie in der JSON-Spezifikation.
Im Folgenden fassen wir einige wichtige Aspekte bei der Arbeit mit JSON zusammen:
- JSON-Objekte beginnen immer mit einer öffnenden geschweiften Klammer (
{
) und enden mit einer schließenden geschweiften Klammer (}
). - Sie können JSON-Eigenschaften in anderen Eigenschaften schachteln.
- JSON-Eigenschaftswerte können Arrays sein.
- Bei JSON-Eigenschaftennamen wird zwischen Groß- und Kleinschreibung unterschieden.
- Der JSON-Eigenschaftenname kann ein beliebiger Zeichenfolgenwert (einschließlich Leerzeichen oder Zeichen, die keine Buchstaben sind) sein.
Verschachtelte Eigenschaften
Sie können mit einem Punkt (.
)-Accessor auf geschachteltes JSON zugreifen. Sie können geschachtelte JSON-Eigenschaften in Ihren Abfragen auf die gleiche Weise verwenden, wie Sie auch andere Eigenschaften verwenden.
Das folgende Dokument enthält geschachtelten JSON-Code:
{
"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
}
}
}
}
In diesem Fall sind die Eigenschaften sku
, colors
und sizes
in der metadata
-Eigenschaft geschachtelt. Die name
-Eigenschaft ist auch in der manufacturer
-Eigenschaft geschachtelt.
Dieses erste Beispiel projiziert drei verschachtelte Eigenschaften.
SELECT
p.manufacturer.name,
p.metadata.sku,
p.metadata.sizes.small.inches AS size
FROM
products p
[
{
"name": "AdventureWorks",
"sku": "72109",
"size": 76
}
]
Arbeiten mit Arrays
Zusätzlich zu den geschachtelten Eigenschaften unterstützen JSON-Eigenschaften auch Arrays. Bei Verwendung von Arrays können Sie auf ein bestimmtes Element innerhalb des Arrays zugreifen, indem Sie auf seine Position verweisen.
In diesem Beispiel wird an einer bestimmten Position auf ein Arrayelement zugegriffen.
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"
]
}
]
In den meisten Fällen verwenden Sie jedoch eine Unterabfrage oder Selbstverknüpfung, wenn Sie mit Arrays arbeiten.
Beispiel: Hier ist eine Abfrage, die mehrere Permutationen mittels den potenziellen Arraywerten und einer Kreuzverknüpfung zurückgibt,
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"
}
]
Als weiteres Beispiel könnte die Abfrage auch EXISTS
mit einer Unterabfrage verwenden.
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"
]
Unterschied zwischen NULL und „nicht definiert“
Wenn eine Eigenschaft in einem Element nicht definiert ist, lautet ihr Wert undefined
. Eine Eigenschaft mit dem Wert null
muss explizit definiert und ihr muss der Wert null
zugewiesen sein.
Azure Cosmos DB for NoSQL unterstützt zwei nützliche Systemfunktionen für die Typüberprüfung für null
- und undefined
-Eigenschaften:
IS_NULL
– Überprüft, ob ein Eigenschaftswertnull
ist.IS_DEFINED
– Überprüft, ob ein Eigenschaftswert definiert oderundefined
ist.
Hier ist eine Beispielabfrage, die für jedes Element im Container nach zwei Feldern sucht.
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
}
]
Weitere Informationen über allgemeine Operatoren und deren Verhalten für null
- und undefined
-Werte finden Sie unter Gleichheits- und Vergleichsoperatoren.
Reservierte Schlüsselwörter und Sonderzeichen in JSON-Code
Sie können auf Eigenschaften zugreifen, indem Sie den Anführungszeichenoperator ([]
) für Eigenschaften verwenden. SELECT c.grade
and SELECT c["grade"]
gleichwertig. Diese Syntax ist hilfreich, um eine Eigenschaft mit Escapezeichen zu versehen, die Leerzeichen oder Sonderzeichen enthält oder den gleichen Namen wie ein SQL-Schlüsselwort oder ein reserviertes Wort hat.
Beispiel: Hier ist eine Abfrage, die auf eine Eigenschaft auf verschiedene Weise verweist.
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"
}
]
JSON-Ausdrücke
Die Abfrageprojektion unterstützt JSON-Ausdrücke und -Syntax.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"$1": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
In diesem Beispiel erstellt die SELECT
-Klausel ein JSON-Objekt. Da das Beispiel keine Schlüssel bereitstellt, verwendet die Klausel die implizite Argumentvariable mit Namen $<index-number>
.
In diesem Beispiel wird dasselbe Feld explizit benannt.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
products p
[
{
"product": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
Alternativ kann die Abfrage das Objekt vereinfachen, um die Benennung eines redundanten Felds zu vermeiden.
SELECT VALUE {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
]
Aliaswerte
Sie können explizit Aliase für Werte in Abfragen verwenden. Wenn eine Abfrage zwei Eigenschaften mit demselben Namen hat, verwenden Sie Aliase, um mindestens eine der Eigenschaften umzubenennen, sodass sie im projizierten Ergebnis eindeutig sind.
Beispiele
Das für die Erstellung von Aliasen verwendete AS
-Schlüsselwort ist optional, wie im folgenden Beispiel gezeigt.
SELECT
p.name,
p.metadata.sku AS modelNumber
FROM
products p
[
{
"name": "Teapo rainbow surfboard",
"modelNumber": "72109"
}
]
Aliaswerte mit reservierten Schlüsselwörtern oder Sonderzeichen
Sie können Aliasing nicht verwenden, um einen Wert als Eigenschaftennamen mit einem Leerzeichen, einem Sonderzeichen oder einem reservierten Wort zu projizieren. Wenn Sie die Projektion eines Werts ändern möchten, z. B. in einen Eigenschaftennamen mit einem Leerzeichen, können Sie einen JSON-Ausdruck verwenden.
Ein Beispiel:
SELECT VALUE {
"Product's name | ": p.name,
"Model number => ": p.metadata.sku
}
FROM
products p
[
{
"Product's name | ": "Teapo rainbow surfboard",
"Model number => ": "72109"
}
]