Tengo una colección T, con 2 campos: Grade1y Grade2, y quiero seleccionar aquellos con condición Grade1 > Grade2, ¿cómo puedo obtener una consulta como en MySQL?
Select * from T Where Grade1 > Grade2
Puede usar $ where. Solo tenga en cuenta que será bastante lento (tiene que ejecutar código Javascript en cada registro), así que combine con consultas indexadas si puede.
db.T.find( { $where: function() { return this.Grade1 > this.Grade2 } } );
o más compacto:
db.T.find( { $where : "this.Grade1 > this.Grade2" } );
puede usar $exprcomo se describe en la respuesta reciente
$where: function() { return this.Grade1 - this.Grade2 > variable }?db.T.find({$where: function() {return this.startDate == ISODate("2017-01-20T10:55:08.000Z");}});no devuelve nada, incluso uno de los documentos de la colección esISODate("2017-01-20T10:55:08.000Z"). Pero<=y>=parece trabajo. ¿alguna idea?this.startDate.getTime() == ISODate("2017-01-20T10:55:08.000Z").getTime()Puede usar $ expr (operador de versión 3.6 de mongo) para usar funciones de agregación en una consulta normal.
Comparar
query operatorsvsaggregation comparison operators.Consulta regular:
Consulta de agregación:
fuente
Si su consulta consta solo del
$whereoperador, puede pasar solo la expresión JavaScript:Para un mayor rendimiento, ejecute una operación agregada que tenga un
$redactcanalización para filtrar los documentos que satisfacen la condición dada.La
$redactcanalización incorpora la funcionalidad de$projecte$matchimplementar la redacción a nivel de campo, donde devolverá todos los documentos que coincidan con la condición que usa$$KEEPy elimina de los resultados de la canalización aquellos que no coincidan con la$$PRUNEvariable.Al ejecutar la siguiente operación agregada, se filtran los documentos de manera más eficiente que con
$wherecolecciones grandes, ya que se usa una única canalización y operadores nativos de MongoDB, en lugar de evaluaciones de JavaScript con$where, lo que puede ralentizar la consulta:que es una versión más simplificada de incorporar las dos canalizaciones
$projecty$match:Con MongoDB 3.4 y versiones posteriores:
fuente
En caso de que el rendimiento sea más importante que la legibilidad y siempre que su condición consista en operaciones aritméticas simples, puede usar la canalización de agregación. Primero, use $ project para calcular el lado izquierdo de la condición (lleve todos los campos al lado izquierdo). Luego use $ match para comparar con una constante y un filtro. De esta forma evita la ejecución de JavaScript. A continuación se muestra mi prueba en Python:
Usando agregado:
1 bucle, lo mejor de 1: 192 ms por bucle
Usando buscar y $ donde:
1 bucle, lo mejor de 1: 4,54 s por bucle
fuente