使用 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
为以下名称的文档。
展平和展开
本节介绍两个 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 => <array_path>, 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
对象都会成为一个表格行。
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
大量将展开,然后生成的文档将被展平。