Работа с JSON в Azure Cosmos DB для NoSQL
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
В Azure Cosmos DB для NoSQL элементы хранятся в формате JSON. Система типов и выражения могут обрабатывать только типы JSON. Дополнительные сведения см. в спецификациях JSON.
Мы кратко рассмотрим некоторые важные аспекты работы с JSON:
- Объекты JSON всегда начинаются с левой фигурной скобки (
{
) и заканчиваются правой фигурной скобкой (}
). - Свойства JSON можно вкладывать друг в друга.
- Значения свойств JSON могут быть массивами.
- В именах свойств JSON учитывается регистр.
- Имя свойства JSON может быть любым строковым значением (включая пробелы или символы, которые не являются буквами).
Вложенные свойства
Доступ к вложенным JSON можно получить с помощью метода доступа dot (.
). В запросах вложенные свойства JSON можно использовать так же, как и любые другие свойства.
Вот пример документа с вложенным 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
}
}
}
}
В этом случае свойства sku
, colors
и sizes
вложены в свойство metadata
. Свойство name
также вложено в manufacturer
свойство.
В первом примере проектируются три вложенных свойства.
SELECT
p.manufacturer.name,
p.metadata.sku,
p.metadata.sizes.small.inches AS size
FROM
products p
[
{
"name": "AdventureWorks",
"sku": "72109",
"size": 76
}
]
Работа с массивами
Кроме вложенных свойств, JSON также поддерживает массивы. При работе с массивами можно получить доступ к определенному элементу в массиве, ссылаясь на его положение.
В этом примере обращается к элементу массива по определенной позиции.
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"
]
}
]
Однако в большинстве случаев при работе с массивами используется вложенный запрос или самосоединяющийся .
Например, ниже приведен запрос, возвращающий несколько перемутов с помощью потенциальных значений массива и перекрестного соединения.
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"
}
]
В качестве другого примера запрос также может использоваться EXISTS
с вложенным запросом.
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"
]
Разница между значениями null и undefined
Если свойство не определено в элементе, его значение равно undefined
. Свойство со значением null
должно быть явно определено, и ему должно быть присвоено значение null
.
Azure Cosmos DB для NoSQL поддерживает две полезные функции системы проверки типов для null
и undefined
свойств:
IS_NULL
— проверяет, имеет ли значениеnull
свойства.IS_DEFINED
— проверяет, определена ли значение свойства илиundefined
.
Ниже приведен пример запроса, который проверяет наличие двух полей для каждого элемента в контейнере.
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
}
]
Дополнительные сведения об общих операторах и их поведении для null
и undefined
значений см. в разделе "Операторы равенства и сравнения".
Зарезервированные ключевые слова и специальные символы в JSON
Свойства можно использовать с помощью оператора заключенного в кавычки свойства []
. Например, выражение SELECT c.grade
and SELECT c["grade"]
являются эквивалентными. Этот синтаксис полезен, когда необходимо экранировать свойство, которое содержит пробелы, специальные символы или совместно использует имя, совпадающее с именем ключевого слова SQL или зарезервированного слова.
Например, вот запрос, который ссылается на свойство несколькими различными способами.
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
Проекция запросов поддерживает выражения JSON и синтаксис.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"$1": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
В этом примере SELECT
предложение создает объект JSON. Так как в примере нет ключа, предложение использует неявное имя $<index-number>
переменной аргументов.
В этом примере явно указывается одно и то же поле.
SELECT {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
products p
[
{
"product": {
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
}
]
Кроме того, запрос может выровнил объект, чтобы избежать именования избыточного поля.
SELECT VALUE {
"productName": p.name,
"largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
products p
[
{
"productName": "Teapo rainbow surfboard",
"largeSizeInFeet": 7.66667
}
]
Значения псевдонима
В запросах можно явно задавать значения псевдонимов. Если в запросе имеются два свойства с совпадающими именами, используйте псевдонимы для переименования одного или обоих свойств, чтобы устранить неоднозначность в отображаемом результате.
Примеры
Ключевое слово, используемое AS
для псевдонима, является необязательным, как показано в следующем примере.
SELECT
p.name,
p.metadata.sku AS modelNumber
FROM
products p
[
{
"name": "Teapo rainbow surfboard",
"modelNumber": "72109"
}
]
Значения псевдонима с зарезервированными ключевыми словами или специальными символами
Нельзя использовать псевдонимы для проецирования значения в качестве имени свойства с пробелом, специальным символом или зарезервированным словом. Чтобы изменить проекцию значения, например, на имя свойства с пробелом, можно использовать выражение JSON.
Приведем пример:
SELECT VALUE {
"Product's name | ": p.name,
"Model number => ": p.metadata.sku
}
FROM
products p
[
{
"Product's name | ": "Teapo rainbow surfboard",
"Model number => ": "72109"
}
]