L'opzione migliore è usare $redact
fase della pipeline di aggregazione:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Quindi stai guardando il valore dei millisecondi dalla differenza che è maggiore del valore dei millisecondi per un giorno. Il $subtract
fa i calcoli per la differenza e quando vengono sottratte due date viene restituita la differenza in millisecondi.
Il $redact
operatore accetta un'espressione logica come "se", e dove quella condizione è true
esegue l'azione in "allora" che è $$KEEP
il documento. Dove è false
quindi il documento viene rimosso dai risultati con $$PRUNE
.
Si noti che poiché questa è una condizione logica e non un valore impostato o un intervallo di valori, non viene utilizzato un "indice".
Poiché le operazioni nella pipeline di aggregazione sono codificate in modo nativo, questa è l'esecuzione più veloce di tale istruzione che puoi ottenere.
L'alternativa è la valutazione JavaScript con $where
. Questo richiede un'espressione di funzione JavaScript che deve restituire allo stesso modo un true
o false
valore. Nella shell puoi abbreviare in questo modo:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Stessa cosa, tranne per il fatto che la valutazione JavaScript richiede l'interpretazione e verrà eseguita molto più lentamente di .aggregate()
equivalente. Allo stesso modo, questo tipo di espressione non può utilizzare un indice per ottimizzare le prestazioni.
Per il meglio risultati, memorizzare la differenza nel documento. Quindi puoi semplicemente eseguire query direttamente su quella proprietà e, naturalmente, puoi anche indicizzarla.