Haz todo lo posible por interpretar el código bien previamente a usarlo a tu trabajo y si tdeseas aportar algo puedes dejarlo en la sección de comentarios.
Solución:
Puede usar un $where. Solo tenga en cuenta que será bastante lento (tiene que ejecutar el código Javascript en cada registro), así que combínelo 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" );
UPD para mongodb v.3.6+
puedes usar $expr
como se describe en la respuesta reciente
Puede usar $expr (operador de versión 3.6 mongo) para usar funciones de agregación en consultas regulares.
Comparar query operators
contra aggregation comparison operators
.
Consulta habitual:
db.T.find($expr:$gt:["$Grade1", "$Grade2"])
Consulta de agregación:
db.T.aggregate($match:$expr:$gt:["$Grade1", "$Grade2"])
Si su consulta consiste únicamente en la $where
operador, puede pasar solo la expresión de JavaScript:
db.T.find("this.Grade1 > this.Grade2");
Para obtener un mayor rendimiento, ejecute una operación agregada que tenga un $redact
tubería para filtrar los documentos que cumplen la condición dada.
los $redact
pipeline incorpora la funcionalidad de $project
y $match
para implementar la redacción a nivel de campo donde devolverá todos los documentos que coincidan con la condición usando $$KEEP
y elimina de la canalización los resultados que no coinciden con el $$PRUNE
variable.
Ejecutar la siguiente operación agregada filtra los documentos de manera más eficiente que usar $where
para colecciones grandes, ya que utiliza una canalización única y operadores nativos de MongoDB, en lugar de evaluaciones de JavaScript con $where
lo que puede ralentizar la consulta:
db.T.aggregate([
"$redact":
"$cond": [
"$gt": [ "$Grade1", "$Grade2" ] ,
"$$KEEP",
"$$PRUNE"
]
])
que es una versión más simplificada de incorporar las dos tuberías $project
y $match
:
db.T.aggregate([
"$project":
"isGrade1Greater": "$cmp": [ "$Grade1", "$Grade2" ] ,
"Grade1": 1,
"Grade2": 1,
"OtherFields": 1,
...
,
"$match": "isGrade1Greater": 1
])
Con Mongo DB 3.4 y más nuevos:
db.T.aggregate([
"$addFields":
"isGrade1Greater": "$cmp": [ "$Grade1", "$Grade2" ]
,
"$match": "isGrade1Greater": 1
])
Reseñas y valoraciones
No se te olvide comunicar esta sección si si solucionó tu problema.