sql >> Base de Datos >  >> NoSQL >> MongoDB

mongodb:consulta por el período de tiempo entre dos campos de fecha

La mejor opción es usar $redact etapa de canalización de agregación:

db.collection.aggregate([
    { "$redact": {
        "$cond": {
            "if": {
                "$gt": [
                    { "$subtract": [ "$lastUpdate", "$createdDate" ] },
                    1000 * 60 * 60 * 24
                ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Entonces, está viendo el valor de milisegundos de la diferencia que es mayor que el valor de milisegundos para un día. El $subtract hace los cálculos para la diferencia, y cuando se restan dos fechas, se devuelve la diferencia en milisegundos.

El $redact operador toma una expresión lógica como "si", y donde esa condición es true toma la acción en "entonces" que es $$KEEP el documento. Donde es false luego el documento se elimina de los resultados con $$PRUNE .

Tenga en cuenta que dado que esta es una condición lógica y no un valor establecido o un rango de valores, no se usa un "índice".

Dado que las operaciones en la canalización de agregación están codificadas de forma nativa, esta es la ejecución más rápida de una declaración de este tipo que puede obtener.

La alternativa es la evaluación de JavaScript con $where . Esto toma una expresión de función de JavaScript que debe devolver de manera similar un true o false valor. En el caparazón, puede abreviar así:

db.collection.find(function() {
    return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
       > ( 1000 * 60 * 60 * 24 );
})

Lo mismo, excepto que la evaluación de JavaScript requiere interpretación y se ejecutará mucho más lentamente que .aggregate() equivalente. Del mismo modo, este tipo de expresión no puede usar un índice para optimizar el rendimiento.

Para lo mejor resultados, almacene la diferencia en el documento. Luego, simplemente puede consultar directamente sobre esa propiedad y, por supuesto, también puede indexarla.