Поделиться через


Работа с массивами и объектами в Azure Cosmos DB для NoSQL

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Ниже приведен элемент, используемый в примерах в этой статье.

{
  "name": "Sondon Fins",
  "categories": [
     { "name": "swim" },
     { "name": "gear"}
  ],
  "metadata": {
    "sku": "73310",
    "manufacturer": "AdventureWorks"
  },
  "priceInUSD": 132.35,
  "priceInCAD": 174.50
}

Массивы

Массивы можно создавать с помощью статических значений, как показано в следующем примере.

SELECT
  [p.priceInUSD, p.priceInCAD] AS priceData
FROM products p
[
  {
    "priceData": [
      132.35,
      174.5
    ]
  }
]

Можно также использовать ARRAY выражение для создания массива из результатов вложенного запроса. Этот запрос получает все отдельные категории.

SELECT
    p.id,
    ARRAY (SELECT DISTINCT VALUE c.name FROM c IN p.categories) AS categoryNames
FROM
    products p
[
  {
    "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
    "categoryNames": [
      "swim",
      "gear"
    ]
  }
]

Итерация

API для NoSQL обеспечивает поддержку итерации массивов JSON с IN ключевым словом в источнике FROM .

Например, следующий запрос выполняет итерацию tags для каждого элемента в контейнере. Выходные данные разбивает значение массива и сглаживает результаты в один массив.

SELECT
    *
FROM 
  products IN products.categories
[
  {
    "name": "swim"
  },
  {
    "name": "gear"
  }
]

Вы можете дополнительно отфильтровать каждую отдельную запись массива, как показано в нижеприведенном примере:

SELECT VALUE
    p.name
FROM
    p IN p.categories
WHERE
    p.name LIKE "ge%"

Вы получите такие результаты:

[
  "gear"
]

Вы также можете агрегировать результат итерации массива. Например, следующий запрос подсчитывает количество тегов:

SELECT VALUE
    COUNT(1)
FROM
    p IN p.categories

Вы получите такие результаты:

[
  2
]

Примечание.

При использовании ключевого IN слова для итерации нельзя фильтровать или проектовать любые свойства за пределами массива. Вместо этого следует использовать самосоединяемые соединения.