MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

mongodb:Abfrage des Zeitraums zwischen zwei Datumsfeldern

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.