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.