使用 Atlas SQL 语句进行查询
本页面提供了 Atlas SQL 查询示例。 您将找到使用 SQL 语法查询集合的基本示例,以及使用 FLATTEN
和UNWIND
处理嵌套数据的更高级示例。
示例查询
尝试对高级配置示例联合数据库实例运行以下Atlas SQL查询,或对其进行修改以读取您自己的数据。
注意
这些示例使用短格式语法。
SELECT 声明
SELECT * FROM sessions;
Atlas SQL 会返回 Sessions
集合中的所有文档。
LIMIT 声明
SELECT * FROM users LIMIT 2;
Atlas SQL 会返回 Users
集合中的两个文档。
WHERE 语句
SELECT * FROM users WHERE name = 'Jon Snow';
Atlas SQL 可返回 Users
集合中用户 name
Jon Snow
为以下名称的文档。
带关键字
借助 WITH
关键字,可以更轻松地创建派生数据源以供后续使用。
WITH RecentSales AS ( SELECT customer_id, SUM(amount) AS total_sales FROM sales WHERE sale_date > '2025-01-01' GROUP BY customer_id ) SELECT customer_id, total_sales FROM RecentSales WHERE total_sales > 1000;
Atlas SQL会返回 Sales
集合中满足以下条件的文档:customer_id
在 1 月 1 之后,2025 的总销售额大于 1000。
展平和展开
本节介绍两个 Atlas SQL 功能,它们可让与文档结构的交互变得更容易。这些是 Atlas SQL 所独有的。
展平
FLATTEN
会将半结构化数据(JSON 中的名称-值对)展平为单独的列。字段名变成列名,在行中存储该字段的所有值。
展平嵌套文档的语法是一个 FLATTEN
函数,该函数可以在 FROM
子句中与数据源和选项结合使用。
SELECT * FROM FLATTEN(<data source> WITH DEPTH => <integer>, SEPARATOR => <string> )
变量 | 必要性 | 说明 |
---|---|---|
<data source> | 必需 | 要展平的数据源。 |
| Optional | 表示要展平的子文档层数的正整数。默认为展平每个层级的子文档。 |
| Optional | 在连接字段名时用作分隔符的字符串。默认值为 |
展平示例
在一个示例场景中,一个 customerInfo
集合包含了采用如下结构的文档:
{ id: 1, location: "New York", customer: { age: 50, email: "customer@email.com", satisfaction: 5 } }
如果运行查询 SELECT * FROM customerInfo
,Atlas SQL 会返回包含以下顶级字段的文档:
| 1 |
| "New York" |
| { age: 50, 电子邮件: "customer@email.com",statusment: 5 } |
如果运行查询 SELECT * FROM FLATTEN(customerInfo)
,Atlas SQL 会返回包含以下顶级字段的文档:
| 1 |
| "New York" |
| 50 |
| "customer@email.com" |
| 5 |
当您使用 FLATTEN
时,原始文档中的每个扁平化字段都会成为结果集中的顶级字段。嵌套字段与其父字段名称连接并使用默认分隔符 _
分隔。
Unwind
UNWIND
从输入数据源解构数组字段,为该数组中的每个项目输出一行。 要了解有关展开的更多信息,请参阅 $unwind聚合阶段文档。
展开数组字段的语法是一个UNWIND
函数,该函数可以在FROM
子句中与数据源和选项结合使用。
SELECT * FROM UNWIND(<data source> WITH PATH | PATHS => <array_paths>, INDEX => <identifier>, OUTER => <bool> )
变量 | 必要性 | 说明 |
---|---|---|
<data source> | 必需 | 待展开数组字段的源。 |
| 必需 | 数据源中要展开的字段的路径。使用括号指定多个路径。 |
| Optional | 为索引列指定的名称。如果省略,Atlas SQL 将不会建索引字段。 |
| Optional | 指示是否保留具有空值、缺失值或空数组值的文档的标记。如果为 |
展开示例:顶级字段
在一个示例场景中,一个 customerInfo
集合包含了采用如下结构的文档:
{ id: 1, location: "New York", customer: { age: 50, email: "customer@email.com", satisfaction: 5 }, visits: [ { year: 2020, score: 10 }, { year: 2021, score: 8 }, { year: 2022 score: 7 } ] }
如果运行查询 SELECT * FROM customerInfo
,Atlas SQL 会返回包含以下顶级字段的文档:
| 1 |
| "New York" |
| { age: 50, 电子邮件: "customer@email.com",statusment: 5 } |
| [ { 年份:2020,得分:10 }, { 年份:2021,得分:8 }, { 年份:2022,得分:7 } ] |
如果运行查询 SELECT * FROM UNWIND(customerInfo WITH PATH => visits, INDEX => idx)
,Atlas SQL 会返回包含以下顶级字段的文档:
| 1 | 1 | 1 |
| "New York" | "New York" | "New York" |
| { age: 50, 电子邮件: "customer@email.com",statusment: 5 } | { age: 50, 电子邮件: "customer@email.com",statusment: 5 } | { age: 50, 电子邮件: "customer@email.com",statusment: 5 } |
| 0 | 1 | 2 |
| { year: 2020, score: 10 } | { year: 2021, score: 8 } | { year: 2022, score: 7 } |
当您将 UNWIND
与 PATH => visits
一起使用时,每个 visits
对象都会成为一个表格行。
展开示例:嵌套数组和同级数组
在一个示例场景中,一个 customerInfo
集合包含了采用如下结构的文档:
{ "id": 1, "location": "New York", "customer": { "age": 50, "email": "customer@email.com", "satisfaction": 5 }, "visits": [ { "year": 2020, "score": 10 }, { "year": 2021, "score": 8 }, { "year": 2022, "score": 7 } ], "purchases": [ { "transaction": "1A", "transactions": [ { "amount": 100 }, { "amount": 150 } ] }, { "transaction": "2B", "transactions": [ { "amount": 200 } ] } ] }
假设您运行以下查询:
SELECT v.year AS visit_year, v.score AS visit_score, p.transaction AS transaction_id, t.amount AS purchase_amount FROM UNWIND( customerInfo WITH PATHS => ( visits[INDEX => visit_idx], purchases[OUTER => TRUE, INDEX => purchase_idx].transactions[] ), INDEX => idx, OUTER => FALSE )
前面的查询执行以下操作:
展开
visits
大量并指定索引名称visit_idx
,以追踪展开大量内的索引位置。展开
purchases
大量,并展开每个purchases
对象内的transactions
大量。它还使用OUTER => TRUE
保留任何缺少transactions
大量或为空的购买。
Atlas SQL返回包含以下字段的文档:
visit_year | visit_score | transaction_id | purchase_amount |
---|---|---|---|
2020 | 10 | 1一种 | 100 |
2020 | 10 | 2B | 150 |
2021 | 8 | 1一种 | 100 |
2021 | 8 | 2B | 150 |
在结果中,每行包含来自单个 visits
条目和单个 transactions
条目的数据。
FLATTEN 和 UNWIND 组合示例
以下示例结合了 FLATTEN
和UNWIND
函数。
在一个示例场景中,一个 customerInfo
集合包含了采用如下结构的文档:
{ id: 1, location: "New York", customer: { age: 50, email: "customer@email.com", satisfaction: 5 }, visits: [ { year: 2020, score: 10 }, { year: 2021, score: 8 }, { year: 2022 score: 7 } ] }
如果运行查询 SELECT * FROM customerInfo
,Atlas SQL 会返回包含以下顶级字段的文档:
| 1 |
| "New York" |
| 5 |
| { age: 50, 电子邮件: "customer@email.com",statusment: 5 } |
| [ { 年份:2020,得分:10 }, { 年份:2021,得分:8 }, { 年份:2022,得分:7 } ] |
如果运行查询 Select * from FLATTEN(UNWIND(customerInfo WITH PATH => visits, INDEX => idx))
,Atlas SQL 会返回包含以下顶级字段的文档:
| 1 | 1 | 1 |
| "New York" | "New York" | "New York" |
| 5 | 5 | 5 |
| 50 | 50 | 50 |
| "customer@email.com" | "customer@email.com" | "customer@email.com" |
| 0 | 1 | 2 |
| 2020 | 2021 | 6 月 |
| 10 | 8 | 7 |
当您同时使用FLATTEN
和UNWIND
函数时, visits
大量将展开,然后生成的文档将被展平。