Uso de JSON en Azure Cosmos DB for NoSQL

SE APLICA A: NoSQL

En Azure Cosmos DB for NoSQL, los elementos se almacenan como JSON. El sistema de tipos y las expresiones se restringen para tratar únicamente con tipos JSON. Para más información, consulte la especificación de JSON.

Resumimos algunos aspectos importantes del trabajo con JSON:

  • Los objetos JSON siempre comienzan con una llave de apertura { y terminan con una llave de cierre }.
  • Puede tener propiedades JSON anidadas entre sí.
  • Los valores de propiedad JSON pueden ser matrices.
  • Los nombres de propiedad JSON distinguen entre mayúsculas y minúsculas.
  • El nombre de la propiedad JSON puede ser cualquier valor de cadena (incluidos espacios o caracteres que no son letras).

Propiedades anidadas

Puede acceder a JSON anidado con un descriptor de acceso de punto(.). Puede usar las propiedades JSON anidadas en las consultas de la misma manera que puede usar cualquier otra propiedad.

Este es un documento con JSON anidado:

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

En este caso, las propiedades sku, colors y sizes están anidadas en la propiedad metadata. La propiedad name también está anidada dentro de la propiedadmanufacturer.

En este primer ejemplo se proyectan dos propiedades anidadas.

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

Trabajo con matrices

Además de las propiedades anidadas, JSON también admite matrices. Al trabajar con matrices, puede tener acceso a un elemento específico dentro de la matriz haciendo referencia a su posición:

En este ejemplo se obtiene acceso a un elemento de matriz en una posición específica.

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

Sin embargo, en la mayoría de los casos se utilizan subconsultas o autocombinación cuando se trabaja con matrices.

Por ejemplo, esta es una consulta que devuelve varias permutaciones mediante los posibles valores de matriz y una combinación cruzada,

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

Como otro ejemplo, la consulta también podría usar EXISTS con una subconsulta.

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

Diferencia entre NULL y undefined

Si una propiedad no está definida en un elemento, su valor es undefined. Una propiedad con el valor null se debe definir explícitamente y asignar el valor null.

Azure Cosmos DB for NoSQL admite dos útiles funciones del sistema de comprobación de tipos para las propiedadesnull y undefined:

  • IS_NULL: comprueba si el valor de una propiedad es null.
  • IS_DEFINED: comprueba si el valor de una propiedad es definido o undefined.

Esta es una consulta de ejemplo que comprueba si hay dos campos en cada elemento del contenedor.

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

Para obtener más información sobre los operadores comunes y su comportamiento para los valores null y undefined , consulte operadores de igualdad y comparación.

Palabras clave reservadas y caracteres especiales en JSON

Puede acceder a las propiedades mediante el operador de la propiedad entre comillas []. Por ejemplo, SELECT c.grade and SELECT c["grade"] son equivalentes. Esta sintaxis es útil para crear una secuencia de escape para una propiedad que contiene espacios en blanco, caracteres especiales o que tiene el mismo nombre que una palabra clave SQL o una palabra reservada.

Por ejemplo, esta es una consulta que hace referencia a una propiedad de varias maneras distintas.

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

Expresiones JSON

La proyección de consultas admite expresiones JSON y sintaxis.

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

En este ejemplo, la cláusula SELECT crea un objeto JSON. Dado que la muestra no proporciona ninguna clave, la cláusula utiliza el argumento implícito nombre de variable$<index-number>.

En este ejemplo se denomina explícitamente el mismo campo.

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

Como alternativa, la consulta puede aplanar el objeto para evitar nombrar un campo redundante.

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

Valores de alias

Puede establecer alias para valores de manera explícita en las consultas. Si una consulta tiene dos propiedades con el mismo nombre, establezca alias para cambiar el nombre de una o ambas propiedades de modo que se elimine su ambigüedad en el resultado proyectado.

Ejemplos

La palabra claveAS que se usa para el alias es opcional, como se muestra en el siguiente ejemplo.

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

Valores alias con palabras clave reservadas o caracteres especiales

No se pueden usar alias para proyectar un valor como un nombre de propiedad con un espacio, un carácter especial o una palabra reservada. Si deseara cambiar la proyección de un valor para que, por ejemplo, tuviera un nombre de propiedad con un espacio, podría usar una expresión JSON.

Este es un ejemplo:

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