Trabalhar com JSON no Azure Cosmos DB para NoSQL
APLICA-SE A: NoSQL
No Azure Cosmos DB para NoSQL, os itens são armazenados como JSON. O sistema de tipos e as expressões são restringidos para processar apenas os tipos JSON. Para obter mais informações, consulte a especificação JSON.
Resumimos alguns aspetos importantes do trabalho com JSON:
- Os objetos JSON sempre começam com uma
{
chave esquerda e terminam com uma}
chave direita - Você pode ter propriedades JSON aninhadas umas nas outras
- Os valores de propriedade JSON podem ser matrizes
- Os nomes de propriedade JSON diferenciam maiúsculas de minúsculas
- O nome da propriedade JSON pode ser qualquer valor de cadeia de caracteres (incluindo espaços ou caracteres que não são letras)
Propriedades aninhadas
Você pode acessar JSON aninhado usando um acessador de ponto (.
). Você pode usar propriedades JSON aninhadas em suas consultas da mesma forma que pode usar quaisquer outras propriedades.
Aqui está um documento com JSON aninhado:
{
"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
}
}
}
}
Nesse caso, as sku
propriedades , colors
e e sizes
são todas aninhadas dentro da metadata
propriedade. A name
propriedade também está aninhada dentro da manufacturer
propriedade.
Este primeiro exemplo projeta três propriedades aninhadas.
SELECT
p.manufacturer.name,
p.metadata.sku,
p.metadata.sizes.small.inches AS size
FROM
products p
[
{
"name": "AdventureWorks",
"sku": "72109",
"size": 76
}
]
Trabalhar com arrays
Além das propriedades aninhadas, o JSON também oferece suporte a matrizes. Ao trabalhar com matrizes, você pode acessar um elemento específico dentro da matriz fazendo referência à sua posição.
Este exemplo acessa um elemento de matriz em uma posição 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"
]
}
]
Na maioria dos casos, no entanto, você usa uma subconsulta ou associação automática ao trabalhar com matrizes.
Por exemplo, aqui está uma consulta que retorna várias permutações usando os valores de matriz potencial e uma associação 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 outro exemplo, a consulta também pode ser usada EXISTS
com uma 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"
]
Diferença entre nulo e indefinido
Se uma propriedade não estiver definida em um item, seu valor será undefined
. Uma propriedade com o valor null
deve ser explicitamente definida e atribuída a um null
valor.
O Azure Cosmos DB para NoSQL dá suporte a duas funções e undefined
propriedades úteis do sistema de verificação de null
tipo:
IS_NULL
- verifica se o valor de uma propriedade énull
.IS_DEFINED
- verifica se um valor de propriedade está definido ouundefined
.
Aqui está um exemplo de consulta que verifica dois campos em cada item no contêiner.
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 obter mais informações sobre operadores comuns e seu comportamento para null
e undefined
valores, consulte Operadores de igualdade e comparação.
Palavras-chave reservadas e caracteres especiais em JSON
Você pode acessar propriedades usando o operador []
de propriedade cotado. Por exemplo, SELECT c.grade
e SELECT c["grade"]
são equivalentes. Essa sintaxe é útil para escapar de uma propriedade que contém espaços, caracteres especiais ou tem o mesmo nome que uma palavra-chave SQL ou palavra reservada.
Por exemplo, aqui está uma consulta que faz referência a uma propriedade de algumas maneiras 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"
}
]
Expressões JSON
A projeção de consulta suporta expressões JSON e sintaxe.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"$1": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
Neste exemplo, a SELECT
cláusula cria um objeto JSON. Como o exemplo não fornece nenhuma chave, a cláusula usa o nome $<index-number>
da variável de argumento implícito .
Este exemplo nomeia explicitamente o mesmo 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, a consulta pode nivelar o objeto para evitar nomear um 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
Você pode explicitamente alias valores em consultas. Se uma consulta tiver duas propriedades com o mesmo nome, use o aliasing para renomear uma ou ambas as propriedades para que elas sejam desambiguadas no resultado projetado.
Exemplos
A AS
palavra-chave usada para aliasing é opcional, como mostrado no exemplo a seguir.
SELECT
p.name,
p.metadata.sku AS modelNumber
FROM
products p
[
{
"name": "Teapo rainbow surfboard",
"modelNumber": "72109"
}
]
Valores de alias com palavras-chave reservadas ou caracteres especiais
Não é possível usar aliasing para projetar um valor como um nome de propriedade com um espaço, caractere especial ou palavra reservada. Se você quisesse alterar a projeção de um valor para, por exemplo, ter um nome de propriedade com um espaço, poderia usar uma expressão JSON.
Eis um exemplo:
SELECT VALUE {
"Product's name | ": p.name,
"Model number => ": p.metadata.sku
}
FROM
products p
[
{
"Product's name | ": "Teapo rainbow surfboard",
"Model number => ": "72109"
}
]