Saltar al contenido

Condición de consulta MongoDb al comparar 2 campos

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 $wherelo 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *