在 Azure Cosmos DB for 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": "a0151c77-ffc3-4fa6-a495-7b53d936faa6",
    "categoryNames": [
      "swim",
      "gear"
    ]
  }
]

迭代

NoSQL 的 API 支持在 JSON 数组上迭代,在 FROM 源中使用 IN 关键字

例如,下一个查询对容器中的每个项执行 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 关键字进行迭代时,不能筛选或投射数组外部的任何属性。 应改用自联接