Работа с 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"
  }
]