Esta página describe la sintaxis y semántica de MongoSQL, un dialecto de SQL que utiliza la Interfaz SQL para recuperar SQL de los usuarios o herramientas para luego traducir esas instrucciones a MQL (lenguaje de consulta de MongoDB). Esta página enumera y describe las cláusulas, operadores, expresiones y funciones admitidas.
Compatibilidad y limitaciones
MongoSQL se basa en el estándar SQL-92. Sin embargo, MongoSQL no es totalmente compatible con SQL-92 debido a las siguientes limitaciones:
La
dateEl tipo de dato no es compatible. Utilicetimestampen su lugar.La aritmética de intervalos y de intervalos de fechas no está soportada.
MongoSQL no es compatible con MongoDB Vector Search y MongoDB Search.
Sistema de tipos
Tipos de datos
Los tipos de datos MongoSQL son el conjunto de BSON types. Todos estos tipos pueden ser consultados en MongoSQL. Ellos son:
String (
STRING)Documento (
DOCUMENT)Matriz (
ARRAY)BinData (
BINDATA)ObjectId (
OBJECTID)Booleano (
BOOL)Fecha (
TIMESTAMP)Nulo (
NULL)Regex (
REGEX)entero de 32 bits (
INT)Doble (
DOUBLE)Long (
LONG)Sello de tiempo (
BSON_TIMESTAMP)Decimales (
DECIMAL)MinKey (
MINKEY)MaxKey (
MAXKEY)DBPointer (
DBPOINTER)Símbolo (
SYMBOL)Javascript con alcance (
JAVASCRIPTWITHSCOPE)JavaScript (
JAVASCRIPT)
Cada tipo en MongoSQL tiene un nombre (entre paréntesis arriba), que es una palabra clave que se puede utilizar para referirse al tipo cuando sea necesario, como en una expresión como CAST.
Conversiones de tipo
Las conversiones de tipos explícitas se expresan a través de la función CAST o del operador ::. Todos los tipos numéricos son mutuamente comparables; MongoSQL permite operaciones entre los diversos tipos numéricos sin necesidad de convertir los operandos al mismo tipo numérico.
Schemas
MongoSQL convierte los valores de documentos flexibles de MongoDB en tipos mediante un esquema. Un MongoSQL Unesquema es una colección de hechos sobre una expresión o colección que se sabe que son verdaderos en el momento de la compilación.
Por ejemplo, un esquema MongoSQL puede dictar que una expresión sea un booleano o un documento con subcampos, o que una expresión sea un arreglo con una longitud de uno o un entero positivo.
Si no se cumple una restricción de tipo estático, la consulta no se compilará.
La gestión de esquemas difiere entre la herramienta manual local y la herramienta automatizada Atlas.
Cláusulas
Las consultas de MongoSQL admiten un conjunto básico de cláusulas SQL. Las cláusulas disponibles son:
SELECTFROMWHEREGROUP BYHAVINGORDER BYOFFSETLIMITSeleccionar
SELECT begins every Atlas SQL query. MongoSQL permite que SELECT VALUE y SELECT VALUES se utilicen de manera intercambiable.
MongoSQL requiere que las instrucciones anidadas SELECT tengan un alias.
SELECT foo FROM (SELECT bar FROM baz) as subSelect
SELECT DISTINCT
Utiliza SELECT DISTINCT para excluir filas duplicadas del conjunto de resultados. La comprobación de duplicados sigue la semántica de igualdad de MongoDB, donde el orden de los campos importa para la comparación de documentos y tanto el orden como el valor de los elementos importan para la comparación de arreglos.
SELECT DISTINCT bar FROM baz
CAST()
MongoSQL admite la función CAST(), que le permite convertir dinámicamente valores en su consulta a un tipo de datos determinado.
SELECT * FROM table WHERE period_start_utc >= CAST('2023-01-01T00:00:00.000Z' AS TIMESTAMP)
de
FROM es la primera cláusula evaluada en cada query de MongoSQL.
FROM puede extraer datos de varias fuentes, incluyendo colecciones (SELECT * FROM foo), arreglos (SELECT * FROM [{'a': 1}]), uniones (SELECT * FROM a JOIN b), tablas derivadas (SELECT * FROM (SELECT a FROM foo) d) y FLATTEN y UNWIND.
DONDE
La cláusula WHERE es un filtro para los datos entrantes. Su expresión debe tener estáticamente el tipo BOOL o NULL y puede evaluarse como MISSING.
Agrupar por
GROUP BY proporciona un medio para agrupar y agregar datos.
Si se utiliza GROUP BY en un campo que se ha aplanado usando FLATTEN or UNWIND, se requiere un alias.
SELECT customerAge, COUNT(*) FROM Sales GROUP BY customer.age AS customerAge
Funciones de agregación
MongoSQL admite las siguientes funciones de agregación.
Nombre | Descripción | notas |
|---|---|---|
| Empuja el argumento al final de un arreglo. El resultado total de esta función será un arreglo. | El argumento de |
| Empuja el argumento al final de un arreglo removiendo duplicados. La salida total de esta función será un arreglo con todos los elementos duplicados eliminados. Los duplicados se determinan usando el operador | El argumento de |
| Devuelve el promedio de todos los argumentos. | El argumento debe tener un tipo estático de tipo numérico. |
| Cuenta la cantidad de elementos. | El argumento de |
| Devuelve el primer elemento del grupo. | Determinista solo cuando la entrada tiene un orden determinista; de lo contrario, es indefinido. |
| Devuelve el primer elemento del grupo. Determinista solo cuando la entrada tiene orden determinista, de lo contrario está indefinido. | El argumento de |
| Devuelve el elemento máximo ordenado por el operador MongoSQL | El argumento debe tener un tipo estático para poder ser comparado mediante el operador |
| Devuelve un documento formado por la fusión sucesiva de documentos, con el elemento anterior utilizado como el lado izquierdo. En caso de claves duplicadas, se conserva el valor de la clave en el nuevo elemento. Al igual que con | El argumento debe tener el tipo estático |
| Devuelve el elemento mínimo según lo ordenado por el operador | El argumento debe tener un tipo estático para poder ser comparado mediante el operador |
| Devuelve la desviación estándar de todos los elementos dentro de toda la población del grupo. | El argumento debe tener un tipo estático numérico. Consulta stdDevPop. |
| Devuelve la desviación estándar de una muestra de todos los elementos de un grupo. Vea stdDevPop. | El argumento debe tener un tipo estático de tipo numérico. |
| Devuelve la suma de todos los argumentos. | El argumento debe tener un tipo estático de tipo numérico. |
TENIENDO
La cláusula HAVING funciona de la misma manera que una cláusula WHERE, pero después de la cláusula GROUP BY. Al igual que la cláusula WHERE, la cláusula HAVING toma una expresión que debe ser estáticamente de tipo BOOL o NULL y puede evaluarse como MISSING. Puede hacer referencia a alias definidos en GROUP BY y contener expresiones con funciones de agregación. Solo los alias definidos en GROUP BY están disponibles para la cláusula HAVING.
ORDER BY
La cláusula ORDER BY proporciona una forma de ordenar un conjunto de resultados por una o más claves de ordenación. Cada clave de ordenación puede ser una referencia de columna o un literal entero que se refiere a una expresión SELECT por su posición en la lista de expresiones seleccionadas. Las claves de ordenación que son referencias de columna pueden ser identificadores compuestos. Estos identificadores compuestos pueden estar calificados con nombres de fuentes de datos o hacer referencia a subcampos de documentos.
MongoSQL ordena MISSING antes que NULL y NULL antes que todos los demás valores. La cláusula ORDER BY requiere que todos los valores posibles en una expresión de clave de ordenación se puedan verificar estáticamente para que sean comparables mediante los operadores > (mayor que) y < (menor que).
LIMIT y OFFSET
Las cláusulas LIMIT y OFFSET permiten a los usuarios recuperar solo algunas de las filas devueltas por una query. Si se proporciona un número LIMIT, no se devolverá más que esa cantidad de filas. Si se proporciona un número de OFFSET, se omite esa cantidad de filas antes de devolver las filas.
Tanto LIMIT como OFFSET deben ser enteros positivos. Usar LIMIT o OFFSET sin ORDER BY no garantiza el mismo resultado.
Cuando LIMIT y OFFSET están configurados, se omitirán las OFFSET filas antes de devolver el resto de los resultados, que no deben contener más de LIMIT filas.
LIMIT i, j es una forma más corta de LIMIT i OFFSET j.
LIMIT y OFFSET puede usarse en subconsultas.
Operaciones de conjuntos
Los operadores de conjunto UNION y UNION ALL devuelven un único conjunto de resultados para dos consultas SELECT. El operador UNION elimina las filas duplicadas del conjunto de resultados, mientras que el operador UNION ALL no las elimina. El conjunto de resultados devuelto por estos operadores no tiene un orden definido.
MongoSQL no admite operaciones de conjunto INTERSECT o EXCEPT.
Expresiones
Identifiers
Los identificadores en MongoSQL se refieren a bases de datos, tablas y columnas. Los identificadores de MongoSQL admiten todos los caracteres UTF-8 excepto el carácter nulo \x00.
En MongoSQL, algunos identificadores están restringidos para evitar conflictos con caracteres que tienen otro significado semántico. Para que un identificador incluya dicho carácter, debe estar delimitado, es decir, entre comillas dobles o comillas invertidas. Por ejemplo, un identificador debe estar delimitado si comienza con un dígito o si entra en conflicto con una palabra clave reservada (p. "10cent" ej.,). Los identificadores distinguen entre mayúsculas y minúsculas, estén delimitados o no.
Aliases
Los identificadores se utilizan para todos los alias en MongoSQL. En la mayoría de los casos, MongoSQL devuelve un error si se utiliza un alias más de una vez en la misma cláusula. La excepción a esto es que los alias pueden repetirse en ambos lados de un UNION ALL. Esto también aplica a los alias generados automáticamente.
Keywords
Las palabras clave de MongoSQL (como SELECT, FROM, JOIN, etc.) no pueden usarse como identificadores sin delimitadores.
Literales
MongoSQL admite literales para booleanos, nulos, números y cadenas de texto. Las cadenas están encerradas entre comillas simples. Para incluir un carácter de comilla simple en un literal de string, duplicalo ('o''clock').
Los enteros literales se escriben como INT cuando están dentro del rango de enteros con signo de 32bits y LONG en caso contrario. Los números literales de punto flotante o los números en notación científica tienen el tipo DOUBLE.
Nota
MongoSQL admite la conversión implícita de tipos de cadenas con codificación JSON extendida a su tipo correspondiente. Dado que MongoSQL admite todos los tipos BSON y todos ellos pueden representarse como JSON extendido, se pueden incluir valores literales de cualquier tipo en una consulta. Es decir, se puede incluir un valor de cadena JSON extendida donde se espere una expresión y MongoSQL lo convierte automáticamente al tipo literal correspondiente. Por ejemplo, SELECT
'{"$numberInt": "1"}' + 2 FROM foo se interpreta como SELECT 1 + 2 FROM foo. Esto es especialmente útil para literales de fecha y hora. Por ejemplo, SELECT * FROM
foo WHERE myDate > '{"$date": "1995-06-28T03:05:00.000Z"}'.
Recomendamos utilizar JSON extendido implícito en lugar de la función CAST() (o su operador abreviado, ::) para escribir valores literales. Por ejemplo, no recomendamos CAST('1995-06-28T03:05:00.000Z' AS TIMESTAMP) para incluir un valor datetime literal en una query. El uso de CAST() o :: es válido y funciona, pero podría tener implicaciones negativas para el rendimiento, especialmente cuando se utiliza en una cláusula WHERE. La conversión implícita extendida de JSON no tiene ningún impacto negativo en el rendimiento.
Recomendamos que uses CAST() en una cláusula WHERE cuando quieras garantizar la seguridad de tipos y evitar la ambigüedad.
Expresiones entre paréntesis
Una expresión entre paréntesis es una expresión agrupada entre paréntesis. Cada vez que hay operadores infijos presentes, puede ser necesario el uso de paréntesis (u otro mecanismo similar) para distinguir el orden de las operaciones. MongoSQL tiene varios operadores infijos, como + y ::. Por ejemplo, el valor de 1 + 2 * 3 es 7, mientras que el valor de (1 + 2) * 3 es 9.
Operadores
MongoSQL admite los siguientes operadores básicos:
+-*/||<<=!===>>=BETWEENANDORNOT
Expresiones de subconsulta
Una subconsulta es una consulta SQL dentro de otra consulta. Se puede usar una subconsulta en cualquier lugar donde se pueda usar una expresión.
MongoSQL admite subconsultas escalares y de tabla. Una subconsulta escalar devuelve un conjunto de resultados con cero o una fila y una columna. Se puede usar en la mayoría de los casos donde un valor literal o de una sola columna es válido. Una subconsulta de tabla devuelve cero o más filas y una o más columnas.
Documentos y expresiones de acceso a campos
Los documentos pueden ser representados con una sintaxis similar a la de los objetos JSON. Las claves deben ser cadenas de texto y los valores pueden tener cualquiera de los tipos soportados. Para acceder a los campos de los documentos, MongoSQL soporta dos opciones: notación de puntos y notación "corchete".
La notación de puntos es similar al acceso de campos en la agregación de MongoDB. Por ejemplo, si un documento doc contiene un campo f, entonces se utiliza la expresión doc.f para acceder al valor de ese campo. La notación de corchetes utiliza corchetes ([ y ]) alrededor de un nombre de campo para acceder al campo con ese nombre. Por ejemplo, consideremos el mismo documento descrito anteriormente: doc["f"] se utiliza para acceder al valor de ese campo.
Nulo y Ausente
BSON distingue entre NULL y MISSING. En el caso de NULL hay un campo con el valor literal NULL, mientras que en el caso de MISSING, el campo ha desaparecido.
comentarios
Los comentarios son secuencias de caracteres dentro de las queries que no impactan la ejecución de la query. MongoSQL es compatible tanto con los comentarios estándar de SQL como con los comentarios en bloque de estilo C.
Los comentarios estándar de SQL comienzan con double guiones y terminan con una nueva línea:
\-- This is a standard SQL comment
Los comentarios de bloque comienzan con \* y finalizan en la ocurrencia coincidente de */.
\* This is a multiline comment */