# 使用 SQL 查询 MongoDB

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/zh-cn/help/idea/llms.txt).

在 MongoDB 和 亚马逊 DocumentDB 中，要操作数据或执行其他操作，需要使用 JavaScript 为 mongo shell 编写脚本。 对于主要使用 SQL 查询数据的开发者，也可以考虑为 MongoDB 或 亚马逊 DocumentDB 的集合使用 SQL。 IntelliJ IDEA 将把您的 SQL 查询转换为 JavaScript。

* 要查看 SQL 的 JavaScript 版本，请右键点击查询并选择 显示翻译后的脚本 。

* 当前实现支持 SELECT 查询及以下子句: `JOIN` 、 `WHERE` 、 `GROUP BY` 、 `HAVING` 、 `排序依据` 、 `限制` 、 `偏移量` 。

Procedure: 查看 SQL 查询的 JavaScript 翻译

* 右键点击查询并选择   显示翻译后的脚本  。 要将 JavaScript 代码复制到剪贴板，请点击   将翻译后的脚本复制到剪贴板  。

您可以从   JS 脚本预览   修改并运行脚本。

MongoDB:

![已转换的 JavaScript 代码](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_translated_javascript_code.png)

亚马逊 DocumentDB:

![已转换的 JavaScript 代码](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_translated_javascript_code.png)

## 数据类型

IntelliJ IDEA 支持以下数据类型：

* String，Integer，Float，Boolean

* NULL、NAN、INFINITY

* 数组（ `[1, 2, 3]` ）和映射（ `{a: 1, b: 2, c: 3}` ）

数组和映射可以包含任何表达式。

```SQL
SELECT [1, 3 + 1 - 2, price] AS elements FROM sales;
SELECT {a: 1 + 2, b: NULL, c: FALSE, d: [1, 2]} FROM sales;
```

您可以使用单引号或双引号中的字符串字面量。

请写列名时不要使用引号或使用重音符号(  ``` )。

```SQL
SELECT  _id,
        `acquisitions`,
        `category_code`,
        `description`,
        email_address,
        phone_number
FROM companies WHERE category_code = 'social'
AND description = "Mobile Dating";
```

## 对象构造函数

您可以使用以下对象构造函数：  `BinData` 、  `HexData` 、  `UUID` 、  `MD5` 、  `ObjectID` 、  `日期` 、  `ISODate` 、  `代码` 、  `DBRef` 、  `RegExp` 、  `NumberInt` 、  `NumberLong` 、  `NumberDecimal` 、  `时间戳` 、  `MinKey` 、  `MaxKey` 。

您可以使用或跳过  `new`  关键字。 IntelliJ IDEA 会自动将  `new`  关键字添加到 MongoDB 或 亚马逊 DocumentDB 查询中。 此功能不适用于  `日期` 对象构造函数，因为  `Date()`   `new Date()` 之间存在差异。  `Date()`  返回当前日期字符串，并且  `new Date()`  作为日期对象。

如果函数名称未知，IntelliJ IDEA 会在函数名称之前搜索  `new`  关键字。 如果  `new`  关键字存在，则名称被视为对象构造函数。 否则，作为函数调用。 例如，以下查询：

```SQL
SELECT  new UnknownTypeConstructor() AS A,
        new NumberInt() AS B,
        NumberInt(1) AS C FROM companies;
```

将被翻译为：

```JAVASCRIPT
db.getSiblingDB("admin").getCollection("companies").aggregate([
  {
    $project: {"A": {$literal: new UnknownTypeConstructor()},
               "B": {$literal: new NumberInt()},
               "C": {$literal: new NumberInt(1)},
               "_id": 0}
  }
])
```

## 函数／方法

除  `map` 、  `reduce` 、  `过滤器`  和  `let`  外，您可以使用 MongoDB 和 亚马逊 DocumentDB 中所有可用的聚合管道运算符。 此外，您可以使用 COUNT(*)，但不支持 COUNT (expression)。

在 MongoDB 和 亚马逊 DocumentDB 中，某些函数／方法需要命名实参。 要使用命名参数，请使用 PostgreSQL 的语法来表示命名参数（例如，  `=>`  或  `:=` ）。 如果您未为参数化函数指定名称，您将会收到错误。 请考虑以下关于  `dateToString`  函数的示例：

```SQL
SELECT dateToString(date => ISODate(),
                    format := '%H:%M:%S:%L%z',
                    timezone => 'Europe/London') AS 'Date'
FROM companies;
```

您可以在 [docs.mongodb.com 的聚合管道操作符](https://docs.mongodb.com/manual/reference/operator/aggregation/)中查看所有支持命名参数的管道操作符列表。

### 限制

* 由于 SQL、MongoDB 和 亚马逊 DocumentDB 中处理聚合函数／方法的方式不同，不能将 AVG、SUM、MIN 和 MAX 等聚合函数／方法用作非聚合。 例如， `SELECT MAX(1,2,3)` 将不起作用。 在 MongoDB 和 亚马逊 DocumentDB 中， `AVG` 、 `SUM` 、 `MIN` 和 `MAX` 等函数既可以是聚合函数，也可以是非聚合函数。 如果将它们放在 `组` 块中，则为聚合函数。 否则，它们是非聚合的。 在 SQL 中，没有这样的依赖关系，您可以在不使用 GROUP BY 子句的情况下使用聚合函数（例如， `SELECT AVG(x) FROM t` ）。

* 您不能在其他聚合函数中调用聚合函数。

## 运算符

当前支持以下功能：

* 操作数： `=` 、 `==` 、 `>=` 、 `<=` 、 `>` 、 `<` 、 `<>` 、 `!=` 、 `+` 、 `-` 、 `/` 、 `*` 、 `%` 、 `AND` 、 `OR` 、 `NOT` 、 `LIKE` 、 `NOT LIKE` 、 `IS` 、 `IS NOT` 、 `IN` 、 `NOT IN` 、 `BETWEEN` 、 `NOT BETWEEN` 。

* 可以为 `LIKE` 运算符使用通配符。 这些通配符会转换为适用于 MongoDB 或 亚马逊 DocumentDB 的有效正则表达式。 MongoDB: ![LIKE 运算符的通配符](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_wildcards_for_the_like_operator.png) 亚马逊 DocumentDB: ![LIKE 运算符的通配符](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_wildcards_for_the_like_operator.png)

## SQL 语句

### SELECT

对于  `SELECT`  查询，支持以下功能。

* 选项： `DISTINCT` 、 `全部` 。

* 聚合函数和非聚合函数。

* 通过使用点符号名称访问嵌入字段。 请考虑以下示例。 MongoDB: ![嵌入字段](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_embedded_fields.png) 亚马逊 DocumentDB: ![嵌入字段](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_embedded_fields.png)

#### 限制

* 列可以有别名。 别名不得包含句点( `。` )。

### FROM

* 您可以为表使用别名。

* 必须为嵌套的 `SELECT` 语句使用别名。

* 可以使用嵌套的 `SELECT` 查询。 例如，以下查询是有效的： MongoDB: ![嵌套 SELECT 查询](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_nested_select_queries.png) 亚马逊 DocumentDB: ![嵌套 SELECT 查询](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_nested_select_queries.png)

#### 限制

* 别名不得包含句点( `。` )。

### JOIN

* 仅支持 `JOIN` （ `内连接` ）和 `LEFT JOIN` （ `左外连接` ）。

* 仅支持 `ON` 条件。

* `ON` 部分中只能有一个条件。 以下查询将导致错误： MongoDB: ![ON 部分只有一个条件](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_one_condition_in_the_on_part.png) 亚马逊 DocumentDB: ![ON 部分只有一个条件](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_one_condition_in_the_on_part.png)

* 可以在 `ON` 条件中使用 `==` 或 `=` 运算符。

* 支持多个 `JOIN` 子句。

#### 限制

* 不支持 `使用` 。

* 不能在 `JOIN` 子句中将 `SELECT` 语句用作第二个实参。

* 表名称和别名在 `JOIN` 子句中不能重复。

### WHERE

* `LIKE` 和 `NOT LIKE` 需要字符串文字。 以下查询导致错误： MongoDB: ![LIKE 和 NOT LIKE 需要字符串文字](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_like_and_not_like_require_a_string_literal.png) 亚马逊 DocumentDB: ![LIKE 和 NOT LIKE 需要字符串文字](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_like_and_not_like_require_a_string_literal.png)

### GROUP BY

IntelliJ IDEA 支持  `GROUP BY`  子句。

`SELECT`  子句可以包含功能上依赖于  `GROUP BY`  子句中表达式的表达式。 如果列在  `GROUP BY`  子句中使用，可以在  `SELECT`  子句中使用该列的嵌入字段。

MongoDB:

![GROUP BY](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_group_by.png)

亚马逊 DocumentDB:

![GROUP BY](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentddb_group_by.png)

### HAVING

IntelliJ IDEA 支持  `HAVING`  子句。

MongoDB:

![HAVING](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_having.png)

亚马逊 DocumentDB:

![HAVING](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_having.png)

### 排序依据

IntelliJ IDEA 支持  `排序依据`  子句。 可以使用  `排序方式`  替代  `排序依据` 。

MongoDB:

![排序依据](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_order_by.png)

亚马逊 DocumentDB:

![排序依据](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_order_by.png)

### 限制

IntelliJ IDEA 支持  `限制`  子句。

MongoDB:

![限制](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_limit.png)

亚马逊 DocumentDB:

![限制](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_limit.png)

### 偏移量

IntelliJ IDEA 支持  `偏移量`  子句。

MongoDB:

![偏移量](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_mongodb_offset.png)

亚马逊 DocumentDB:

![偏移量](https://resources.jetbrains.com/help/img/idea/2026.3/db_sql_for_documentdb_offset.png)

