Delen via


Werken met JSON in Azure Cosmos DB for NoSQL

VAN TOEPASSING OP: NoSQL

In Azure Cosmos DB for NoSQL worden items opgeslagen als JSON. Dit betekent dat het typesysteem en expressies alleen geschikt zijn voor JSON-typen. Zie de JSON-specificatie voor meer informatie.

We geven een overzicht van enkele belangrijke aspecten van het werken met JSON:

  • JSON-objecten beginnen altijd met een { accolade links en eindigen met een } rechter brace
  • U kunt JSON-eigenschappen genest hebben binnen elkaar
  • JSON-eigenschapswaarden kunnen matrices zijn
  • JSON-eigenschapsnamen zijn hoofdlettergevoelig
  • De naam van de JSON-eigenschap kan elke tekenreekswaarde zijn (inclusief spaties of tekens die geen letters zijn)

Geneste eigenschappen

U hebt toegang tot geneste JSON met behulp van een punttoegangspunt (.). U kunt geneste JSON-eigenschappen in uw query's op dezelfde manier gebruiken als u andere eigenschappen kunt gebruiken.

Hier volgt een document met geneste 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
      }
    }
  }
}

In dit geval zijn de sku, colorsen sizes eigenschappen allemaal genest binnen de metadata eigenschap. De name eigenschap is ook genest in de manufacturer eigenschap.

In dit eerste voorbeeld worden twee geneste eigenschappen geprojecteerd.

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

Werken met matrices

Naast geneste eigenschappen ondersteunt JSON ook matrices. Wanneer u met matrices werkt, hebt u toegang tot een specifiek element in de matrix door te verwijzen naar de positie ervan.

In dit voorbeeld wordt een matrixelement op een specifieke positie geopend.

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 de meeste gevallen gebruikt u echter een subquery of self-join bij het werken met matrices.

Hier volgt bijvoorbeeld een query die meerdere permutaties retourneert met behulp van de mogelijke matrixwaarden en een cross-join,

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

In een ander voorbeeld kan de query ook worden gebruikt EXISTS met een subquery.

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

Verschil tussen null en niet-gedefinieerd

Als een eigenschap niet is gedefinieerd in een item, is de waarde .undefined Een eigenschap met de waarde null moet expliciet worden gedefinieerd en een null waarde toegewezen.

Azure Cosmos DB for NoSQL ondersteunt twee handige systeemfuncties voor null het controleren van typen en undefined eigenschappen:

  • IS_NULL - controleert of een eigenschapswaarde is null.
  • IS_DEFINED - controleert of een eigenschapswaarde is gedefinieerd of undefined.

Hier volgt een voorbeeldquery die controleert op twee velden op elk item in de container.

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

Zie gelijkheids- en vergelijkingsoperators voor meer informatie over veelvoorkomende operators en hun gedrag voor null en undefined waarden.

Gereserveerde trefwoorden en speciale tekens in JSON

U kunt toegang krijgen tot eigenschappen met behulp van de operator van de eigenschap tussen []aan citeringen. Zo is SELECT c.grade bijvoorbeeld het equivalent van SELECT c["grade"]. Deze syntaxis is handig om een eigenschap te escapen die spaties, speciale tekens bevat of dezelfde naam heeft als een SQL-trefwoord of gereserveerd woord.

Hier volgt bijvoorbeeld een query die verwijst naar een eigenschap op een aantal verschillende manieren.

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-expressies

Queryprojectie ondersteunt JSON-expressies en syntaxis.

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

In dit voorbeeld maakt de SELECT component een JSON-object. Omdat het voorbeeld geen sleutel biedt, gebruikt de component de naam $<index-number>van de impliciete argumentvariabele.

In dit voorbeeld wordt hetzelfde veld expliciet genoemd.

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

De query kan het object ook platmaken om te voorkomen dat een redundant veld een naam opgegeven.

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

Aliaswaarden

U kunt expliciet aliaswaarden in query's gebruiken. Als een query twee eigenschappen met dezelfde naam heeft, gebruikt u aliasing om de naam van een of beide eigenschappen te wijzigen, zodat deze niet eenduidig zijn in het verwachte resultaat.

Voorbeelden

Het AS trefwoord dat wordt gebruikt voor aliasing is optioneel, zoals wordt weergegeven in het volgende voorbeeld.

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

Aliaswaarden met gereserveerde trefwoorden of speciale tekens

U kunt aliasing niet gebruiken om een waarde als eigenschapsnaam te projecteren met een spatie, speciaal teken of gereserveerd woord. Als u de projectie van een waarde wilt wijzigen in bijvoorbeeld een eigenschapsnaam met een spatie, kunt u een JSON-expressie gebruiken.

Hier volgt een voorbeeld:

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