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 tres propiedades anidadas.
SELECT
p.manufacturer.name,
p.metadata.sku,
p.metadata.sizes.small.inches AS size
FROM
products p
[
{
"name": "AdventureWorks",
"sku": "72109",
"size": 76
}
]
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 esnull
.IS_DEFINED
: comprueba si el valor de una propiedad es definido oundefined
.
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"
}
]