对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

MongoSQL 语言参考

本页概述了 MongoSQL 的语法和语义,MongoDB 是一种SQL方言, SQL接口使用它检索用户或工具的SQL ,然后将这些语句转换为MQL (MongoDB查询语言)。本页列出并描述了支持的子句、操作符、表达式和函数。

  • MongoSQL 基于SQL-92 标准。但是,由于以下限制,MongoSQL 并不完全兼容SQL-92:

    • 不支持date数据类型。 请改用timestamp 。

    • 不支持间隔和日期间隔算术。

  • MongoSQL 不支持MongoDB Vector Search 和MongoDB Search。

MongoSQL 数据类型是BSON 类型的设立。所有这些类型都可以在 MongoSQL 中查询。它们是:

  • string (STRING)

  • 文档 ( DOCUMENT )

  • 数组 ( ARRAY )

  • BinData ( BINDATA )

  • ObjectId (OBJECTID)

  • 布尔值 ( BOOL )

  • 日期 ( TIMESTAMP )

  • 空 ( NULL )

  • 正则表达式 ( REGEX )

  • 32 位整数 (INT)

  • 双精度 ( DOUBLE )

  • 长整型 ( LONG )

  • 时间戳 ( BSON_TIMESTAMP )

  • 十进制 ( DECIMAL )

  • MinKey ( MINKEY )

  • MaxKey ( MAXKEY )

  • DBPointer ( DBPOINTER )

  • 符号 ( SYMBOL )

  • 带作用域的JavaScript (JAVASCRIPTWITHSCOPE)

  • JavaScript ( JAVASCRIPT )

MongoSQL 中的每种类型都有一个名称(在上面的括号中),该名称是一个关键字,可在必要时用于引用该类型,例如在 CAST 等表达式中。

显式类型转换通过 CAST 函数或 ::操作符表示。数值类型都是相互可比较的; MongoSQL 允许在各种数值类型之间进行运算,而无需将操作数转换为相同的数值类型。

MongoSQL 使用模式将 MongoDB 的灵活文档值转换为类型。MongoSQL模式是关于表达式或集合的事实集合,这些事实在编译时已知为 true。

示例,MongoSQL模式可能规定表达式是布尔值或带有子字段的文档,或者表达式是长度为 1 或正整数的大量。

如果不满足静态类型约束,则查询将无法编译。

On-Premise 手动工具和Atlas自动化工具的模式管理有所不同。

MongoSQL 查询支持一设立基本的SQL子句。可用的子句包括:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
OFFSET
LIMIT

SELECT 开始每个Atlas SQL查询。MongoDB 允许 SELECT VALUE 和 SELECT VALUES 互换使用。

MongoSQL 需要嵌套的 SELECT 语句才能具有别名。

SELECT foo FROM (SELECT bar FROM baz) as subSelect

使用 SELECT DISTINCT 从结果设立排除重复行。重复检查遵循MongoDB相等语义,其中字段顺序对于文档比较很重要,元素顺序和值对于大量比较很重要。

SELECT DISTINCT bar FROM baz

MongoSQL 支持 CAST() 函数,该函数允许您将查询中的值动态转换为给定的数据类型。

SELECT * FROM table WHERE period_start_utc >= CAST('2023-01-01T00:00:00.000Z' AS TIMESTAMP)

FROM 是在每个 MongoSQL查询中评估的第一个子句。

FROM 可以从各种来源提取数据,包括集合(SELECT * FROM foo) 、数组(SELECT * FROM [{'a': 1}]) 、联接(SELECT * FROM a JOIN b) 、派生表(SELECT * FROM (SELECT a FROM foo) d)以及FLATTEN 和 UNWIND 。

WHERE子句是传入数据的筛选器。 其表达式必须静态具有BOOL或NULL类型,并且计算结果可能为MISSING 。

GROUP BY 提供了一种对数据进行分组和聚合的方法。

GROUP BY 键可以是顶级字段或子字段。如果按子字段群组,则必须在 SELECT 或 GROUP BY 子句中为它们起别名。示例,在 Sales集合中,您的文档结构如下:

{"customer": {"age": <Integer>}}

在此示例中,可以执行以下查询以将 age 子字段用作群组键:

"SELECT customerAge FROM Sales GROUP BY customer.age AS customerAge"
"SELECT customer.age as customerAge FROM Sales GROUP BY customerAge"

即使您对数据进行 FLATTEN,之前的子字段也必须使用别名。示例,在 Orders集合中,您的文档结构如下:

{"customer": {"address": {"city": <String>}}}

展平后,结构变为 {"customer_address_city": <String>},您可以运行以下查询以将 city 子字段用作群组键:

"SELECT city FROM FLATTEN(orders) GROUP BY customer_address_city AS city"
"SELECT customer_address_city AS city FROM FLATTEN(orders) GROUP BY city"

MongoDB 支持以下聚合函数。

名称
说明
注意

ADD_TO_ARRAY

将该参数推入数组的末尾。此函数的总输出将是一个数组。

ADD_TO_ARRAY的参数可以是任何类型。

ADD_TO_SET

将该参数推入数组的末尾,并删除重复项。 此函数的总输出将是一个删除了所有重复项的数组。 重复项是使用=操作符确定的。

ADD_TO_SET的参数可以是任何类型。

AVG

返回所有参数的平均值。

参数必须静态类型化为数值类型。

COUNT

计算元素的数量。 COUNT(*)无条件地对所有值计数。 COUNT(<expression>)会计算表达式的结果不为NULL或MISSING的所有值。

COUNT的参数可以是任何类型。

FIRST

返回组中的第一个元素。

仅当输入具有确定顺序时才具有确定性,否则为未定义。

LAST

返回组中的第一个元素。仅当输入具有确定顺序时才具有确定性,否则为未定义。

LAST的参数可以是任何类型。

MAX

返回按 MongoDB >操作符排序的最大元素。

参数必须是静态类型,以便通过>操作符进行比较。

MERGE_DOCUMENTS

返回通过连续合并文档形成的文档,前一个元素用作左侧。 如果有重复键,则保留新元素中键的值。 与FIRST和LAST一样,仅当输入具有确定性排序时,输出才是确定性的。

参数的静态类型必须为 DOCUMENT。

MIN

返回按 MongoSQL <操作符排序的最小元素。

参数必须是静态类型,以便通过<操作符进行比较。

STDDEV_POP

返回整个群组总体中所有元素的标准偏差。

参数必须静态类型化为数值类型。 请参阅stdDevPop。

STDDEV_SAMP

返回组中所有元素的样本标准偏差。 请参阅stdDevPop。

参数必须静态类型化为数值类型。

SUM

返回所有参数的总和。

参数必须静态类型化为数值类型。

HAVING子句的作用与WHERE子句相同,但在GROUP BY子句之后。 与WHERE子句一样, HAVING子句采用的表达式必须静态具有类型BOOL或NULL ,并且计算结果可能为MISSING 。 它可以引用GROUP BY中定义的别名,并且可以包含具有聚合函数的表达式。 只有在GROUP BY中定义的别名才可用于HAVING子句。

ORDER BY子句提供了一种通过一个或多个排序键对结果设立进行排序的方法。 每个排序键可以是列引用,也可以是根据SELECT表达式在选择表达式列表中的位置来引用该表达式的整数字面量。 作为列引用的排序键可以是复合标识符。 这些复合标识符可以用数据源名称来限定,或者指代文档子字段。

MongoSQL 将 MISSING 排序在 NULL 之前,并将 NULL 排序在所有其他值之前。ORDER BY 子句要求排序键表达式中的所有可能值都可以通过 >(大于)和 <(小于)操作符以静态方式验证其可比性。

LIMIT和OFFSET子句允许用户仅检索查询返回的部分行。 如果提供了LIMIT数字,则返回的行数不会超过该数量。 如果提供了OFFSET数字,则在返回行之前跳过该数量的行。

LIMIT和OFFSET数字都必须是正整数。 使用LIMIT或OFFSET而不使用ORDER BY不能保证结果相同。

当同时设置了LIMIT和OFFSET时,将跳过OFFSET行,然后返回其余结果,其余结果应包含不超过LIMIT行数。

LIMIT i, j 是LIMIT i OFFSET j的缩写形式。

LIMIT 和OFFSET可用于子查询。

UNION 和 UNION ALL设立操作符会为两个 SELECT 查询返回单个结果设立。UNION操作符会删除结果设立的重复行,而 UNION ALL操作符不会删除结果设立的重复行。这些操作符返回的结果设立没有定义的顺序。

MongoSQL 不支持INTERSECT 或 EXCEPT设立操作。

MongoSQL 中的标识符指的是数据库、表和列。MongoSQL 标识符支持除空字符 \x00 之外的所有 UTF-8 字符。

在 MongoDB 中,某些标识符受到限制,以避免与具有其他语义含义的字符发生冲突;要使标识符包含此类字符,必须对其进行分隔,即用双引号或反引号括起来。示例,如果标识符以数字开头或者与保留关键字冲突,则必须对其进行分隔(例如"10cent")。无论是否分隔,标识符都区分大小写。

标识符用于 MongoSQL 中的所有别名。在大多数情况下,如果在同一子句中多次使用别名,MongoDB 会返回错误。例外情况是别名可以在 UNION ALL 的两侧重复。这也适用于自动生成的别名。

MongoSQL 关键字(例如 SELECT、FROM、JOIN 等)不能用作无分隔标识符。

MongoSQL 支持布尔值、空值、数字和字符串的字面量。字符串用单引号括起来。要在字符串字面量中包含单引号字符,请将其加倍 ('o''clock')。

当字面整数在32位有符号整数范围时,其类型为INT ,否则为LONG 。 字面点或科学计数法数字的类型为DOUBLE 。

注意

MongoSQL 支持将扩展JSON编码字符串隐式类型转换为相应的类型。由于 MongoSQL 支持所有BSON 类型,并且所有BSON 类型都可以表示为扩展JSON,因此您可以在查询中包含任何类型的字面值。 也就是说,您可以在任何需要表达式的地方包含扩展的JSON字符串值,MongoDB 会自动转换为相应的字面量类型。 示例,SELECT '{"$numberInt": "1"}' + 2 FROM foo 解释为 SELECT 1 + 2 FROM foo。这对于日期时间文字特别有用。示例,SELECT * FROM foo WHERE myDate > '{"$date": "1995-06-28T03:05:00.000Z"}'。

我们建议您使用隐式扩展 JSON 而不是 CAST() 函数(或其简写操作符::)来写入字面值。示例,我们不建议 CAST('1995-06-28T03:05:00.000Z' AS TIMESTAMP) 在查询中包含字面日期时间值。使用 CAST() 或 :: 是有效且可行的,但可能会对性能产生负面影响,尤其是在 WHERE 子句中使用时。扩展JSON隐式转换不会产生任何负面性能影响。

如果要确保类型安全并避免歧义,我们建议您在 WHERE 子句中使用 CAST()。

带括号的表达式是用括号分组的表达式。任何时候出现中缀运算符时,都可能需要使用括号(或类似的机制)来区分运算顺序。MongoDB 有多个中缀运算符,例如 + 和 ::。示例,1 + 2 * 3 的值为 7,而 (1 + 2) * 3 的值为 9。

MongoSQL 支持以下基本操作符:

  • +

  • -

  • *

  • /

  • ||

  • <

  • <=

  • !=

  • ==

  • >

  • >=

  • BETWEEN

  • AND

  • OR

  • NOT

子查询是某个查询内的 SQL 查询。您可以在任何可以使用表达式的地方使用子查询。

MongoSQL 支持标量子查询和表子查询。标量子查询返回包含零或一行一列的结果设立。它可以用在大多数字面量或单列值有效的地方。表子查询返回零行或多行以及一列或多列。

文档可以使用类似于JSON对象的语法来表示。键必须是字符串,值可以是任何受支持的类型。为了访问权限文档字段,MongoSQL 支持两种选项:“点”表示法和“括号”表示法。

点符号类似于 MongoDB 聚合中的字段访问。 例如,如果文档doc包含字段f ,则表达式doc.f用于访问该字段的值。 方括号表示法是使用方括号( [和] )将字段名括起来访问具有该名称的字段。 例如,对于前面描述的同一个文档: doc["f"]用于访问该字段的值。

BSON 会区分NULL和MISSING 。 在NULL的情况下,存在一个字面值为NULL的字段,而在MISSING的情况下,该字段消失。

Starting in MongoSQL 2.0.0, array functions let you operate on array values natively in your queries. The MAP, FILTER, and REDUCE functions correspond to the $map, $filter, and $reduce aggregation pipeline operators. MongoSQL also supports utility functions that cover common uses of these three functions.

与相应的聚合管道操作符一样,这些函数使用 "this" 变量来引用它们进程的大量元素。 REDUCE 还使用 "value" 变量来引用累加值。 MongoSQL 不支持这些变量的自定义名称。使用 "this" 和 "value"。

MAP(array, function) 将函数应用于大量中的每个元素并返回转换后的大量。 MAP 接受以下参数:

  • 数组表达式

  • 指定如何转换大量每个元素的表达式

要引用 MAP 处理的元素,第二个参数必须使用 "this" 变量。如果大量为空,则 MAP 返回一个空大量。

MAP 可以返回 ARRAY 或 NULL。以下要求应用于参数:

  • 第一个参数必须静态具有 ARRAY 或 NULL 类型,并且计算结果可能为 MISSING。如果第一个参数为 NULL 或 MISSING,MAP 将返回 NULL。大量元素的类型必须满足在第二个参数中使用 "this" 的要求。

  • 第二个参数可以是任何静态语义有效的表达式。第二个参数返回的类型是 MAP 返回的大量中元素的类型。

以下查询将大量的每个元素乘以 2:

SELECT MAP([1, 2, 3], "this" * 2) AS doubled_values
{ '': { 'doubled_values': [2, 4, 6] } }

FILTER(array, function) 将条件应用于大量中的每个元素,并按原始顺序返回一个仅包含条件计算结果为 true 的元素的大量。 FILTER 接受以下参数:

  • 数组表达式

  • 指定针对大量每个元素进行测试的条件的表达式

要引用 FILTER 处理的元素,第二个参数必须使用 "this" 变量。如果大量为空,则 FILTER 返回一个空大量。

FILTER 可以返回 ARRAY 或 NULL。由于 FILTER 不转换元素,因此 FILTER 返回的大量中的元素与输入大量中的元素具有相同的类型。以下要求应用于参数:

  • 第一个参数必须静态具有 ARRAY 或 NULL 类型,并且计算结果可能为 MISSING。如果第一个参数为 NULL 或 MISSING,FILTER 将返回 NULL。大量元素的类型必须满足在第二个参数中使用 "this" 的要求。

  • 第二个参数可以是任何在静态语义上有效且返回 BOOL 或 NULL 的表达式。

以下查询仅保留大量的奇数值元素:

SELECT FILTER([1, 2, 3], MOD("this", 2) = 1) AS odd_values
{ '': { 'odd_values': [1, 3] } }

REDUCE(array, initialValue, function) 将函数应用于大量中的每个元素,并将这些元素组合成一个值,从初始值开始。 REDUCE 接受以下参数:

  • 数组表达式

  • 初始值表达式

  • 表达式,指定如何将大量的每个元素与前一个元素的累加结果组合起来

累加结果作为初始值开始。要引用 REDUCE 处理的元素,第三个参数必须使用 "this" 变量。要引用累加值,第三个参数必须使用 "value" 变量。如果大量为空,则 REDUCE 返回初始值。

REDUCE 返回与第三个参数返回类型相同的值、初始值类型的值,或两者兼而有之。可以是任何 MongoSQL 类型,包括 NULL。以下要求应用于参数:

  • 第一个参数必须静态具有 ARRAY 或 NULL 类型,并且计算结果可能为 MISSING。如果第一个参数为 NULL 或 MISSING,REDUCE 将返回 NULL。大量元素的类型必须满足在第三个参数中使用 "this" 的要求。

  • 第二个参数必须满足第三个参数中 "value" 的使用。

  • 第三个参数可以是任何在静态语义上有效且满足其自身使用 "value" 的表达式。第三个参数返回的类型必须与第二个参数相同、是其超集或子集。如果 MongoSQL 检测到第三个参数中 "value" 的使用与第二个参数的类型之间没有模式冲突,则这两种类型可能不同。

以下查询将大量的元素相加,从 0 开始:

SELECT REDUCE([1, 2, 3], 0, "value" + "this") AS summed_value
{ '': { 'summed_value': 6 } }

您可以将命名函数作为最后一个参数传递给 MAP、FILTER 和 REDUCE,而不是表达式。命名函数是使用单个内置函数或操作符的表达式的简写形式。示例,您可以写入MAP("array", LOWER),而不是 MAP("array", LOWER("this"))。您可以写入REDUCE("array", 0, +),而不是 REDUCE("array", 0, "value" + "this")。

命名函数参数可以与任何一元或二元操作符以及任何接受一个或两个参数的标量函数一起使用。

MongoSQL 支持以下大量函数,这些函数是常见用法 MAP、FILTER 和 REDUCE 的语法别名:

名称
说明
例子

ARRAY_CAST

将大量的所有元素转换为目标类型。

ARRAY_CAST(['1', '2', '3'], INT) 返回 [1, 2, 3]。

ARRAY_EXTRACT

从大量的每个元素中提取字段路径(Field Path)处的值。

ARRAY_EXTRACT([{'a': 1, 'b': 10}, {'a': 2, 'b': '20'}], a) 返回 [1, 2]。

ARRAY_COMPACT

从大量中删除 NULL 和 MISSING 值。

ARRAY_COMPACT([1, NULL, 2, NULL, 3]) 返回 [1, 2, 3]。

ARRAY_REMOVE

从大量中删除某个值的所有实例。

ARRAY_REMOVE([1, 2, 2, 3, 2], 2) 返回 [1, 3]。

ARRAY_COUNT_IF

返回大量中与谓词匹配的元素数。谓词是指使用 "this" 变量测试的元素。

ARRAY_COUNT_IF([1, 2, 3, 4, 5], "this" > 3) 返回 2。

ARRAY_SUM

返回数字大量的总和。

ARRAY_SUM([1, 2, 3]) 返回 6。

ARRAY_PRODUCT

返回数字大量的乘积。

ARRAY_PRODUCT([4, 5, 6]) 返回 120。

ARRAY_AVG

返回数字大量的平均值。

ARRAY_AVG([1, 2, 3]) 返回 2。

ARRAY_ALL

返回布尔值大量的合取值。

ARRAY_ALL([true, false, true]) 返回 false。

ARRAY_ANY

返回布尔值大量的析取。

ARRAY_ANY([false, false, true]) 返回 true。

ARRAY_JOIN

返回字符串大量的串联结果。分隔符参数是可选的,默认为空字符串。

ARRAY_JOIN(['a', 'b', 'c']) returns 'abc'. ARRAY_JOIN(['a', 'b', 'c'], '-') returns 'a-b-c'.

注释是查询中不影响查询执行的字符序列。MongoSQL 支持标准SQL注释和 C 风格的区块注释。

标准 SQL 注释以双破折号开头,以新行结尾:

\-- This is a standard SQL comment

块注释以/*开始,以匹配的*/结束。

/* This is a
multiline comment
*/