本页面提供了 MongoDB 查询示例。您将找到使用SQL语法查询集合的基本示例,以及使用 FLATTEN 和 UNWIND 处理嵌套数据的更高级示例。
示例查询
尝试对 高级配置示例联合数据库实例运行以下 MongoSQL 查询,或对其进行修改以读取您自己的数据。
注意
这些示例使用短格式语法。
SELECT 声明
SELECT * FROM sessions;
MongoSQL 返回 Sessions集合中的所有文档。
LIMIT 声明
SELECT * FROM users LIMIT 2;
MongoSQL 从 Users集合中返回两个文档。
WHERE 语句
SELECT * FROM users WHERE name = 'Jon Snow';
MongoSQL 返回 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;
MongoSQL 返回 Sales集合中满足以下条件的文档:customer_id 在 1 月 1 之后,总销售额大于 1000,2025。
展平和展开
本节介绍两个 MongoSQL 功能,它们可让与文档结构的交互更容易。这些是 MongoDB 所独有的。
展平
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,MongoSQL 将返回包含以下顶级字段的文档:
| 1 |
| "New York" |
| { age: 50, 电子邮件: "customer@email.com",statusment: 5 } |
如果运行查询SELECT * FROM FLATTEN(customerInfo),MongoSQL 将返回包含以下顶级字段的文档:
| 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 | 为索引列指定的名称。如果省略,MongoDB 不会创建索引字段。 |
| 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,MongoSQL 将返回包含以下顶级字段的文档:
| 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),MongoSQL 将返回包含以下顶级字段的文档:
| 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 visits.year AS visit_year, visits.score AS visit_score, purchases.transaction AS transaction_id, purchases.transactions.amount AS purchase_amount, visit_idx, purchase_idx, purchases_transactions_idx AS transaction_idx FROM UNWIND( customerInfo WITH PATHS => ( visits[OUTER => FALSE, INDEX => visit_idx], purchases[INDEX => purchase_idx].transactions[OUTER => FALSE] ), INDEX => idx, OUTER => TRUE )
前面的查询执行以下操作:
展开
visits数组并指定索引名称visit_idx,以追踪展开数组内的索引位置。它不会通过设置OUTER => FALSE来包括缺失的visits或为空的 。展开
purchases数组,并展开每个purchases对象内的transactions数组。它使用OUTER => TRUE保留任何缺失或空的purchases数组。它还分配索引名称purchase_idx来追踪未展开的purchases数组内的索引位置,并分配索引名称purchases_transactions_idx来追踪每个purchases对象内未展开的transactions数组内的位置。从
visits对象中选择year和score子字段,从purchases对象中选择transaction子字段,以及每个purchases对象内的transactions对象中的amount子字段,以及作为所有索引字段。
在前面的查询中:
OUTER => TRUE被设立为UNWIND数据源的顶级参数,使其成为用于所有PATHS的默认值,除非路径级OUTER值不同。INDEX => idx被设立为UNWIND数据源的顶级参数,使其成为用于所有PATHS的默认值,除非路径级INDEX值不同。示例,
transactions未指定特定的INDEX值。因此,它使用此顶级值通过将_idx附加到完整路径来创建索引名称。
MongoSQL 返回包含以下字段的文档:
visit_year | visit_score | transaction_id | purchase_amount | visit_idx | purchase_idx | transaction_idx |
|---|---|---|---|---|---|---|
2020 | 10 | 1A | 100 | 0 | 0 | 0 |
2020 | 10 | 1A | 150 | 0 | 0 | 1 |
2020 | 10 | 2B | 200 | 0 | 1 | 0 |
2021 | 8 | 1A | 100 | 1 | 0 | 0 |
2021 | 8 | 1A | 150 | 1 | 0 | 1 |
2021 | 8 | 2B | 200 | 1 | 1 | 0 |
6 月 | 7 | 1A | 100 | 2 | 0 | 0 |
6 月 | 7 | 1A | 150 | 2 | 0 | 1 |
6 月 | 7 | 2B | 200 | 2 | 1 | 0 |
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,MongoSQL 将返回包含以下顶级字段的文档:
| 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)),MongoSQL 将返回包含以下顶级字段的文档:
| 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大量将展开,然后生成的文档将被展平。