本页概述了 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 允许在各种数值类型之间进行运算,而无需将操作数转换为相同的数值类型。
Schemas
MongoSQL 使用模式将 MongoDB 的灵活文档值转换为类型。MongoSQL 模式是关于表达式或集合的事实集合,这些事实在编译时已知为 true。
示例,MongoSQL模式可能规定表达式是布尔值或带有子字段的文档,或者表达式是长度为 1 或正整数的大量。
如果不满足静态类型约束,则查询将无法编译。
On-Premise 手动工具和Atlas自动化工具的模式管理有所不同。
子句
MongoSQL 查询支持一设立基本的SQL子句。可用的子句包括:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
OFFSET
LIMIT
SELECT
SELECT
开始每个Atlas SQL查询。MongoDB 允许 SELECT VALUE
和 SELECT VALUES
互换使用。
MongoSQL 需要嵌套的 SELECT
语句才能具有别名。
SELECT foo FROM (SELECT bar FROM baz) as subSelect
SELECT DISTINCT
使用 SELECT DISTINCT
从结果设立排除重复行。重复检查遵循MongoDB相等语义,其中字段顺序对于文档比较很重要,元素顺序和值对于大量比较很重要。
SELECT DISTINCT bar FROM baz
CAST()
MongoSQL 支持 CAST()
函数,该函数允许您将查询中的值动态转换为给定的数据类型。
SELECT * FROM table WHERE period_start_utc >= CAST('2023-01-01T00:00:00.000Z' AS TIMESTAMP)
from
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
WHERE
子句是传入数据的筛选器。 其表达式必须静态具有BOOL
或NULL
类型,并且计算结果可能为MISSING
。
GROUP BY
GROUP BY
提供了一种对数据进行分组和聚合的方法。
如果对已使用FLATTEN 或 UNWIND 展平的字段使用GROUP BY
,则需要别名。
SELECT customerAge, COUNT(*) FROM Sales GROUP BY customer.age AS customerAge
聚合函数
MongoDB 支持以下聚合函数。
名称 | 说明 | 注意 |
---|---|---|
| 将该参数推入数组的末尾。此函数的总输出将是一个数组。 |
|
| 将该参数推入数组的末尾,并删除重复项。 此函数的总输出将是一个删除了所有重复项的数组。 重复项是使用 |
|
| 返回所有参数的平均值。 | 参数必须静态类型化为数值类型。 |
| 计算元素的数量。 |
|
| 返回组中的第一个元素。 | 仅当输入具有确定顺序时才具有确定性,否则为未定义。 |
| 返回组中的第一个元素。仅当输入具有确定顺序时才具有确定性,否则为未定义。 |
|
| 返回按 MongoDB | 参数必须是静态类型,以便通过 |
| 返回通过连续合并文档形成的文档,前一个元素用作左侧。 如果有重复键,则保留新元素中键的值。 与 | 参数的静态类型必须为 |
| 返回按 MongoSQL | 参数必须是静态类型,以便通过 |
| 返回整个群组总体中所有元素的标准偏差。 | 参数必须静态类型化为数值类型。 请参阅stdDevPop。 |
| 返回组中所有元素的样本标准偏差。 请参阅stdDevPop。 | 参数必须静态类型化为数值类型。 |
| 返回所有参数的总和。 | 参数必须静态类型化为数值类型。 |
HAVING
HAVING
子句的作用与WHERE
子句相同,但在GROUP BY
子句之后。 与WHERE
子句一样, HAVING
子句采用的表达式必须静态具有类型BOOL
或NULL
,并且计算结果可能为MISSING
。 它可以引用GROUP BY
中定义的别名,并且可以包含具有聚合函数的表达式。 只有在GROUP BY
中定义的别名才可用于HAVING
子句。
ORDER BY
ORDER BY
子句提供了一种通过一个或多个排序键对结果设立进行排序的方法。 每个排序键可以是列引用,也可以是根据SELECT
表达式在选择表达式列表中的位置来引用该表达式的整数字面量。 作为列引用的排序键可以是复合标识符。 这些复合标识符可以用数据源名称来限定,或者指代文档子字段。
MongoSQL 将 MISSING
排序在 NULL
之前,并将 NULL
排序在所有其他值之前。ORDER BY
子句要求排序键表达式中的所有可能值都可以通过 >
(大于)和 <
(小于)操作符以静态方式验证其可比性。
LIMIT 和 OFFSET
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"
)。无论是否分隔,标识符都区分大小写。
Aliases
标识符用于 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
的情况下,该字段消失。
评论
注释是查询中不影响查询执行的字符序列。MongoSQL 支持标准SQL注释和 C 风格的区块注释。
标准 SQL 注释以双破折号开头,以新行结尾:
\-- This is a standard SQL comment
块注释以\*
开始,以匹配的*/
结束。
\* This is a multiline comment */