Docs 菜单
Docs 主页
/
Atlas
/ /

使用 Atlas SQL 语句进行查询

本页面提供了 Atlas SQL 查询示例。 您将找到使用 SQL 语法查询集合的基本示例,以及使用 FLATTENUNWIND处理嵌套数据的更高级示例。

尝试对高级配置示例联合数据库实例运行以下Atlas SQL查询,或对其进行修改以读取您自己的数据。

注意

这些示例使用短格式语法。

SELECT * FROM sessions;

Atlas SQL 会返回 Sessions 集合中的所有文档。

SELECT * FROM users LIMIT 2;

Atlas SQL 会返回 Users 集合中的两个文档。

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>

必需

要展平的数据源。

DEPTH

Optional

表示要展平的子文档层数的正整数。默认为展平每个层级的子文档。

SEPARATOR

Optional

在连接字段名时用作分隔符的字符串。默认值为 _

在一个示例场景中,一个 customerInfo 集合包含了采用如下结构的文档:

{
id: 1,
location: "New York",
customer: {
age: 50,
email: "customer@email.com",
satisfaction: 5
}
}

如果运行查询 SELECT * FROM customerInfo,Atlas SQL 会返回包含以下顶级字段的文档:

id

1

location

"New York"

customer

{ age: 50, 电子邮件: "customer@email.com",statusment: 5 }

如果运行查询 SELECT * FROM FLATTEN(customerInfo),Atlas SQL 会返回包含以下顶级字段的文档:

id

1

location

"New York"

customer_age

50

customer_email

"customer@email.com"

customer_satisfaction

5

当您使用 FLATTEN 时,原始文档中的每个扁平化字段都会成为结果集中的顶级字段。嵌套字段与其父字段名称连接并使用默认分隔符 _ 分隔。

UNWIND 从输入数据源解构数组字段,为该数组中的每个项目输出一行。 要了解有关展开的更多信息,请参阅 $unwind聚合阶段文档。

展开数组字段的语法是一个UNWIND 函数,该函数可以在FROM 子句中与数据源和选项结合使用。

SELECT *
FROM UNWIND(<data source>
WITH PATH | PATHS => <array_paths>,
INDEX => <identifier>,
OUTER => <bool>
)
变量
必要性
说明

<data source>

必需

待展开数组字段的源。

PATH | PATHS

必需

数据源中要展开的字段的路径。使用括号指定多个路径。

INDEX

Optional

为索引列指定的名称。如果省略,Atlas SQL 将不会建索引字段。

OUTER

Optional

指示是否保留具有空值、缺失值或空数组值的文档的标记。如果为 true,则保留具有空值、缺失值或空数组值的文档。默认为 false

在一个示例场景中,一个 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 会返回包含以下顶级字段的文档:

id

1

location

"New York"

customer

{ age: 50, 电子邮件: "customer@email.com",statusment: 5 }

visits

[ { 年份:2020,得分:10 }, { 年份:2021,得分:8 }, { 年份:2022,得分:7 } ]

如果运行查询 SELECT * FROM UNWIND(customerInfo WITH PATH => visits, INDEX => idx),Atlas SQL 会返回包含以下顶级字段的文档:

id

1

1

1

location

"New York"

"New York"

"New York"

customer

{ age: 50, 电子邮件: "customer@email.com",statusment: 5 }

{ age: 50, 电子邮件: "customer@email.com",statusment: 5 }

{ age: 50, 电子邮件: "customer@email.com",statusment: 5 }

idx

0

1

2

visits

{ year: 2020, score: 10 }

{ year: 2021, score: 8 }

{ year: 2022, score: 7 }

当您将 UNWINDPATH => 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 条目的数据。

以下示例结合了 FLATTENUNWIND 函数。

在一个示例场景中,一个 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 会返回包含以下顶级字段的文档:

id

1

location

"New York"

satisfaction

5

customer

{ age: 50, 电子邮件: "customer@email.com",statusment: 5 }

visits

[ { 年份:2020,得分:10 }, { 年份:2021,得分:8 }, { 年份:2022,得分:7 } ]

如果运行查询 Select * from FLATTEN(UNWIND(customerInfo WITH PATH => visits, INDEX => idx)),Atlas SQL 会返回包含以下顶级字段的文档:

id

1

1

1

location

"New York"

"New York"

"New York"

satisfaction

5

5

5

customer_age

50

50

50

customer_email

"customer@email.com"

"customer@email.com"

"customer@email.com"

idx

0

1

2

visits_year

2020

2021

6 月

visits_score

10

8

7

当您同时使用FLATTENUNWIND函数时, visits大量将展开,然后生成的文档将被展平。

后退

私有端点

在此页面上