Tengo una colección T
, con 2 campos: Grade1
y 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 $expr
como 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 operators
vsaggregation comparison operators
.Consulta regular:
Consulta de agregación:
fuente
Si su consulta consta solo del
$where
operador, puede pasar solo la expresión JavaScript:Para un mayor rendimiento, ejecute una operación agregada que tenga un
$redact
canalización para filtrar los documentos que satisfacen la condición dada.La
$redact
canalización incorpora la funcionalidad de$project
e$match
implementar la redacción a nivel de campo, donde devolverá todos los documentos que coincidan con la condición que usa$$KEEP
y elimina de los resultados de la canalización aquellos que no coincidan con la$$PRUNE
variable.Al ejecutar la siguiente operación agregada, se filtran los documentos de manera más eficiente que con
$where
colecciones 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
$project
y$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