Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 punktoperator (.). 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 är egenskaperna sku, 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 undefineddess 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 ge alias till vä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 särskiljs i det projicerade 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 till ett egenskapsnamn med mellanslag, specialtecken eller reserverade ord. Om du vill ändra en 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"
}
]