Arbeta med JSON i Azure Cosmos DB för NoSQL
GÄLLER FÖR: NoSQL
I Azure Cosmos DB för NoSQL lagras objekt som JSON. Typsystem och uttryck är begränsade till att endast hantera JSON-typer. Mer information finns i JSON-specifikationen.
Vi sammanfattar några viktiga aspekter av att arbeta med JSON:
- JSON-objekt börjar alltid med en
{
vänster klammerparentes och slutar med en}
höger klammerparentes - Du kan ha JSON-egenskaper kapslade i varandra
- JSON-egenskapsvärden kan vara matriser
- JSON-egenskapsnamn är skiftlägeskänsliga
- JSON-egenskapsnamn kan vara valfritt strängvärde (inklusive blanksteg eller tecken som inte är bokstäver)
Kapslade egenskaper
Du kan komma åt kapslad JSON med hjälp av en punktåtkomstor (.
). Du kan använda kapslade JSON-egenskaper i dina frågor på samma sätt som du kan använda andra egenskaper.
Här är ett dokument med kapslad 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
}
}
}
}
I det här fallet sku
är egenskaperna , colors
och sizes
alla kapslade i metadata
egenskapen. Egenskapen name
är också kapslad i egenskapen manufacturer
.
I det här första exemplet projiceras tre kapslade egenskaper.
SELECT
p.manufacturer.name,
p.metadata.sku,
p.metadata.sizes.small.inches AS size
FROM
products p
[
{
"name": "AdventureWorks",
"sku": "72109",
"size": 76
}
]
Arbeta med matriser
Förutom kapslade egenskaper stöder JSON även matriser. När du arbetar med matriser kan du komma åt ett visst element i matrisen genom att referera till dess position.
I det här exemplet får du åtkomst till ett matriselement på en viss position.
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"
]
}
]
I de flesta fall använder du dock en underfråga eller självkoppling när du arbetar med matriser.
Här är till exempel en fråga som returnerar flera permutationer med hjälp av potentiella matrisvärden och en korskoppling,
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"
}
]
Som ett annat exempel kan frågan också använda EXISTS
med en underfråga.
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"
]
Skillnad mellan null och odefinierat
Om en egenskap inte har definierats i ett objekt är undefined
dess värde . En egenskap med värdet null
måste uttryckligen definieras och tilldelas ett null
värde.
Azure Cosmos DB for NoSQL stöder två användbara typkontrollsystemfunktioner för null
och undefined
egenskaper:
IS_NULL
– kontrollerar om ett egenskapsvärde ärnull
.IS_DEFINED
– kontrollerar om ett egenskapsvärde har definierats ellerundefined
.
Här är en exempelfråga som söker efter två fält på varje objekt i containern.
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
}
]
Mer information om vanliga operatorer och deras beteende för null
och undefined
värden finns i likhets- och jämförelseoperatorer.
Reserverade nyckelord och specialtecken i JSON
Du kan komma åt egenskaper med hjälp av den citerade egenskapsoperatorn []
. Till exempel är SELECT c.grade
och SELECT c["grade"]
likvärdiga. Den här syntaxen är användbar för att undvika en egenskap som innehåller blanksteg, specialtecken eller har samma namn som ett SQL-nyckelord eller reserverat ord.
Här är till exempel en fråga som refererar till en egenskap på några olika sätt.
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-uttryck
Frågeprojektion stöder JSON-uttryck och syntax.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"$1": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
I det här exemplet SELECT
skapar satsen ett JSON-objekt. Eftersom exemplet inte innehåller någon nyckel använder satsen variabelnamnet $<index-number>
implicit argument .
I det här exemplet namnges uttryckligen samma fält.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
products p
[
{
"product": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
Alternativt kan frågan platta ut objektet för att undvika att namnge ett redundant fält.
SELECT VALUE {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
]
Aliasvärden
Du kan uttryckligen aliasvärden i frågor. Om en fråga har två egenskaper med samma namn använder du alias för att byta namn på en eller båda egenskaperna så att de är tvetydiga i det beräknade resultatet.
Exempel
Nyckelordet AS
som används för alias är valfritt, vilket visas i följande exempel.
SELECT
p.name,
p.metadata.sku AS modelNumber
FROM
products p
[
{
"name": "Teapo rainbow surfboard",
"modelNumber": "72109"
}
]
Aliasvärden med reserverade nyckelord eller specialtecken
Du kan inte använda alias för att projicera ett värde som ett egenskapsnamn med blanksteg, specialtecken eller reserverat ord. Om du vill ändra ett värdeprojektion till att till exempel ha ett egenskapsnamn med ett blanksteg kan du använda ett JSON-uttryck.
Här är ett exempel:
SELECT VALUE {
"Product's name | ": p.name,
"Model number => ": p.metadata.sku
}
FROM
products p
[
{
"Product's name | ": "Teapo rainbow surfboard",
"Model number => ": "72109"
}
]