Die beste Option ist die Verwendung von $redact
Phase der Aggregationspipeline:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Sie betrachten also den Millisekundenwert aus der Differenz, die größer ist als der Millisekundenwert für einen Tag. Der $subtract
berechnet die Differenz, und wenn zwei Datumsangaben subtrahiert werden, wird die Differenz in Millisekunden zurückgegeben.
Der $redact
-Operator nimmt einen logischen Ausdruck als „if“ und wobei diese Bedingung true
ist es führt die Aktion in "then" aus, nämlich $$KEEP
das Dokument. Wobei es false
ist dann wird das Dokument mit $$PRUNE
aus den Ergebnissen entfernt .
Beachten Sie, dass ein "Index" nicht verwendet wird, da dies eine logische Bedingung und kein festgelegter Wert oder Wertebereich ist.
Da die Operationen in der Aggregationspipeline nativ codiert sind, ist dies jedoch die schnellste Ausführung einer solchen Anweisung, die Sie erhalten können.
Die Alternative ist die JavaScript-Auswertung mit $where
. Dies erfordert einen JavaScript-Funktionsausdruck, der ebenfalls ein true
zurückgeben muss oder false
Wert. In der Shell können Sie so abkürzen:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Das Gleiche, außer dass die JavaScript-Evaluierung eine Interpretation erfordert und viel langsamer läuft als .aggregate()
gleichwertig. Aus dem gleichen Grund kann dieser Ausdruckstyp keinen Index verwenden, um die Leistung zu optimieren.
Für das Beste Ergebnisse, speichern Sie die Differenz im Dokument. Dann können Sie diese Eigenschaft einfach direkt abfragen und natürlich auch indizieren.