Docs 菜单
Docs 主页
/
Atlas
/ /

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 VALUESELECT 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子句是传入数据的筛选器。 其表达式必须静态具有BOOLNULL类型,并且计算结果可能为MISSING

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

如果对已使用FLATTEN 或 UNWIND 展平的字段使用GROUP BY ,则需要别名。

SELECT customerAge, COUNT(*) FROM Sales GROUP BY customer.age AS customerAge

MongoDB 支持以下聚合函数。

名称
说明
注意

ADD_TO_ARRAY

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

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

ADD_TO_SET

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

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

AVG

返回所有参数的平均值。

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

COUNT

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

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

FIRST

返回组中的第一个元素。

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

LAST

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

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

MAX

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

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

MERGE_DOCUMENTS

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

参数的静态类型必须为 DOCUMENT

MIN

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

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

STDDEV_POP

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

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

STDDEV_SAMP

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

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

SUM

返回所有参数的总和。

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

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

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

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

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

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

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

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

LIMITOFFSET可用于子查询。

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

MongoSQL 不支持INTERSECTEXCEPT设立操作。

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

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

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

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

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 会区分NULLMISSING 。 在NULL的情况下,存在一个字面值为NULL的字段,而在MISSING的情况下,该字段消失。

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

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

\-- This is a standard SQL comment

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

\* This is a
multiline comment
*/

后退

Errors

在此页面上