解释 Azure Cosmos DB 中的连接

发布:2024-10-01 17:18 阅读:453 点赞:0

一、介绍

Azure Cosmos DB 支持使用标准 SQL 查询项目,采用最熟悉和流行的查询语言,作为一种带有常用运算符和操作的 JSON 查询语言。同样,连接操作允许我们在单个容器内结合来自多个 JSON 对象的数据。这一点非常重要。我们可以在单个容器中查询数据,特别是在嵌套文档中的数组和对象之间。例如,如果文档包含一个数组,您可以将数组元素与父文档或文档的其他属性连接起来。这意味着数据应包含在同一容器中或可用。因此,我们需要非常仔细地设计/建模我们的 Cosmos 数据库。

二、Cosmos DB 中的基本连接结构

以下是应用文档内连接的基本结构。

SELECT *
FROM ContainerName c
JOIN <AliasName> IN c.AttributeName
  • ContainerName 是包含文档的原始容器。
  • c 是指定容器中文档的别名。
  • JOIN 是关键字, 是别名,IN 也是一个关键字,<c.AttributeName> 在文档 (c) 与数组属性 AttributeName 的元素之间创建连接。

三、支持的连接类型

1. 在单个项目内

在这种类型的连接中,我们可以在具有数组的同一单个文档中应用连接。以下是包含员工技能数组的员工表/容器的示例。

员工数据 JSON:

{
    "EmployeeID""1",
    "EmployeeName""John W",
    "Address""Address",
    "Skills": [
        {
            "name"".Net"
        },
        {
            "name"".Net Core"
        },
        {
            "name""MVC"
        }
    ]
}
{
    "EmployeeID""2",
    "EmployeeName""George K",
    "Address""Address2",
    "Skills": [
        {
            "name""C# .Net"
        },
        {
            "name""MVC"
        }
    ]
}
{
    "EmployeeID""3",
    "EmployeeName""William M",
    "Address""Address3",
    "Skills": [
        {
            "name""MS Azure"
        }
    ]
}

Cosmos 查询:

SELECT Emp.EmployeeID, Emp.EmployeeName, skill.name
FROM Emp
JOIN skill IN Emp.Skills

此查询将包括员工数据及其技能,并返回所有员工及其技能的记录。我们还可以在上述查询中进一步应用 WHERE 子句,以根据员工姓名或技能过滤数据,例如:

SELECT Emp.EmployeeID, Emp.EmployeeName, skill.name
FROM Emp
JOIN skill IN Emp.Skills
WHERE Emp.EmployeeName LIKE '%William%'
SELECT Emp.EmployeeID, Emp.EmployeeName, skill.name
FROM Emp
JOIN skill IN Emp.Skills
WHERE skill.name = '.Net'

2. 在容器内的多个项目

在这种类型的连接中,我们可以在同一单个文档中应用连接,具有数组和复杂节点。这是一个嵌套 JSON 文档的示例。连接语法也可以在这种情况下使用。

以下是包含复杂节点数组的员工表/容器的示例。

员工数据 JSON:

{
 "ID""4",
 "Name""John W",
 "Address""JW Address",
 "dependents": [
  {
   "firstname""Allie",
   "gender""FeMale",
   "qualification": [
    {
     "name""BS"
    },
    {
     "name""MS"
    }
   ]
  },
  {
   "firstname""Kevin",
   "gender""Male",
   "qualification": [
    {
     "name""O-Level"
    }
   ]
  }
 ]
}
{
 "ID""5",
 "Name""George K",
 "Address""GK Address",
 "dependents": [
  {
   "firstname""Bata",
   "gender""Male",
   "qualification": [
    {
     "name""BSCS"
    },
    {
     "name""MSCS"
    }
   ]
  },
  {
   "firstname""Serve",
   "gender""FeMale",
   "qualification": [
    {
     "name""A-Level"
    }
   ]
  }
 ]
}

Cosmos 查询:

SELECT Emp.ID 'Emp ID',
Emp.Name 'Emp Name',
depen.firstname 'Dependent Name',
depen.gender 'Dependent Gender',
qualif.name 'Dependent Qualification'
FROM Emp
JOIN depen IN Emp.dependents
JOIN qualif IN depen.qualification

此查询将包括员工数据及其家属信息,并返回所有员工的记录。在上述查询中,使用了别名以区分确切的列值。

我们还可以在上述查询中进一步应用 WHERE 子句,以根据任何标准过滤数据。

四、使用连接的限制

  • 仅限于单个文档内的数组,不能跨不同文档应用连接。
  • 不支持跨容器的连接,与传统 SQL 语法不同。
  • 如果连接的数组很大,性能可能会下降。

五、结论

Azure Cosmos DB 中的连接是一种很好的方式,可以使用 JSON 查询语言查询单个文档或嵌套复杂节点内的数据,尤其是在处理数组时。尽管它们与 SQL 共享一些语法相似性,但它们旨在用于文档模型,并具有自己的限制。在设计涉及连接的查询时,始终考虑并监控性能影响和 RU 消耗。