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 zwei verschachtelte Eigenschaften.

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

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 Eigenschaftswert null ist.
  • IS_DEFINED – Überprüft, ob ein Eigenschaftswert definiert oder undefined 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.

Hier sehen Sie 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"
  }
]