Azure Cosmos DB vNext Emulator:查询和可观测性增强
Source: Dev.to
查询改进
此模拟器版本启用了之前不支持的多种查询模式。本文将重点介绍以下查询功能的增强:
- 改进的 JOIN 操作 – 支持跨多个数组层级的嵌套 JOIN、笛卡尔积 JOIN,以及对原始数组的自连接
- 增强的运算符支持 – 支持字符串操作函数(
CONCAT、LENGTH)和数组操作(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 – 遍历层次数据
通过 children → pets 链接,识别所有宠物及其主人:
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"
(根据具体场景继续构建查询。)