Azure Cosmos DB vNext Emulator:查询和可观测性增强

发布: (2025年12月13日 GMT+8 23:28)
5 min read
原文: Dev.to

Source: Dev.to

查询改进

此模拟器版本启用了之前不支持的多种查询模式。本文将重点介绍以下查询功能的增强:

  • 改进的 JOIN 操作 – 支持跨多个数组层级的嵌套 JOIN、笛卡尔积 JOIN,以及对原始数组的自连接
  • 增强的运算符支持 – 支持字符串操作函数(CONCATLENGTH)和数组操作(ARRAY_LENGTH、直接数组索引)
  • 更好的子文档处理 – 改进对深度嵌套对象属性的查询,并正确处理缺失属性

下面通过实际示例来探讨这些改进。

改进的 JOIN

在 Azure Cosmos DB 中,JOIN 使您能够展平并遍历文档内部的数据,从而处理嵌套和层次结构的数据。

下面是一个示例 family 数据集,每个文档代表一个拥有嵌套数组的家庭。数据集包含三个家庭(Andersen、Wakefield 和 Miller),它们的子女和宠物数量各不相同,展示了 JOIN 在不同数据结构下的处理方式。

[
    {
        "id": "AndersenFamily",
        "lastName": "Andersen",
        "parents": [
            {"firstName": "Thomas", "relationship": "father"},
            {"firstName": "Mary Kay", "relationship": "mother"}
        ],
        "children": [
            {
                "firstName": "Henriette",
                "grade": 5,
                "pets": [{"name": "Fluffy", "type": "Rabbit"}]
            }
        ],
        "tags": ["seattle", "active", "family-friendly"],
        "address": {"state": "WA", "city": "Seattle"}
    },
    {
        "id": "WakefieldFamily",
        "lastName": "Wakefield",
        "parents": [
            {"firstName": "Robin", "relationship": "mother"},
            {"firstName": "Ben", "relationship": "father"}
        ],
        "children": [
            {
                "firstName": "Jesse",
                "grade": 8,
                "pets": [
                    {"name": "Goofy", "type": "Dog"},
                    {"name": "Shadow", "type": "Horse"}
                ]
            },
            {"firstName": "Lisa", "grade": 1, "pets": []}
        ],
        "tags": ["newyork", "urban"],
        "address": {"state": "NY", "city": "New York"}
    },
    {
        "id": "MillerFamily",
        "lastName": "Miller",
        "parents": [{"firstName": "David", "relationship": "father"}],
        "children": [
            {
                "firstName": "Emma",
                "grade": 6,
                "pets": [{"name": "Whiskers", "type": "Cat"}]
            }
        ],
        "tags": ["boston", "academic"],
        "address": {"state": "MA", "city": "Boston"}
    }
]

基本 JOIN – 展平数组

通过展平 children 数组,生成所有家庭子女的列表(例如用于学校名册):

SELECT f.id, f.lastName, c.firstName, c.grade 
FROM f 
JOIN c IN f.children

结果: 每个子女一行 – Henriette(Andersen)、Jesse 与 Lisa(Wakefield)、Emma(Miller)。

带过滤条件的 JOIN

查找特定年级范围内的子女(例如中学学生,年级 ≥ 6):

SELECT f.id, f.lastName, c.firstName, c.grade 
FROM f 
JOIN c IN f.children 
WHERE c.grade >= 6

结果: 仅返回 Jesse(8 年级)和 Emma(6 年级)。

嵌套 JOIN – 遍历层次数据

通过 childrenpets 链接,识别所有宠物及其主人:

SELECT f.id, c.firstName AS child, p.name AS pet, p.type 
FROM f 
JOIN c IN f.children 
JOIN p IN c.pets

结果:

  • Henriette – Fluffy(Rabbit)
  • Jesse – Goofy(Dog)和 Shadow(Horse)
  • Emma – Whiskers(Cat)

(Lisa 因其 pets 数组为空而被省略,展示了内连接的行为。)

笛卡尔积 JOIN – 组合独立数组

将每个子女与每个家庭标签配对,以分析模式或偏好:

SELECT f.id, c.firstName AS child, t AS tag 
FROM f 
JOIN c IN f.children 
JOIN t IN f.tags

结果:

  • Henriette 出现三次(标签:“seattle”、 “active”、 “family‑friendly”)
  • Jesse 与 Lisa 各出现两次(标签:“newyork”、 “urban”)
  • Emma 出现两次(标签:“boston”、 “academic”)。

对原始数组的 JOIN

展平类似 tags 的简单值数组:

SELECT f.id, f.lastName, t AS tag 
FROM f 
JOIN t IN f.tags

结果: 每个标签成为单独的一行,并关联到相应的家庭。

自连接 – 查找组合

通过对同一数组使用不同别名进行连接,发现哪些标签经常一起出现:

SELECT f.id, t1 AS tag1, t2 AS tag2 
FROM f 
JOIN t1 IN f.tags 
JOIN t2 IN f.tags 
WHERE t1 < t2

结果:

  • Andersen 家庭产生三对唯一组合:“active”‑“seattle”、 “active”‑“family‑friendly”、 “family‑friendly”‑“seattle”
  • Wakefield 和 Miller 家庭各产生一对组合(因为它们只有两个标签)。

复杂过滤 – 多层条件

将根级属性与深度嵌套的数组元素结合。例如,查找位于 华盛顿州 的家庭中拥有的所有 兔子

SELECT f.id, f.lastName, c.firstName AS child, p.name AS pet, p.type 
FROM f 
JOIN c IN f.children 
JOIN p IN c.pets 
WHERE f.address.state = "WA" AND p.type = "Rabbit"

(根据具体场景继续构建查询。)

Back to Blog

相关文章

阅读更多 »