Dela via


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 , colorsoch sizes alla kapslade i metadata egenskapen. Egenskapen name är också kapslad i egenskapen manufacturer .

I det här första exemplet projiceras två kapslade egenskaper.

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

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 är null.
  • IS_DEFINED – kontrollerar om ett egenskapsvärde har definierats eller undefined.

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