2016-03-23 5 views

Antwort

6

Der beste Option ist die $redact Aggregation Pipeline-Stufe zu verwenden:

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

So sind Sie auf dem Millisekundenwert aus der Differenz der Suche größer ist als der Wert Millisekunden für einen Tag. Die $subtract berechnet die Differenz, und wenn zwei Daten subtrahiert werden, wird die Differenz in Millisekunden zurückgegeben.

Der Operator $redact nimmt einen logischen Ausdruck als "if", und wo diese Bedingung ist true es dauert die Aktion in "dann", die $$KEEP das Dokument ist. Wo es false ist, wird das Dokument aus den Ergebnissen mit $$PRUNE entfernt.

Beachten Sie, dass ein "Index" nicht verwendet wird, da es sich um eine logische Bedingung und nicht um einen festgelegten Wert oder einen Wertebereich handelt.

Da die Operationen in der Aggregationspipeline nativ codiert sind, ist dies die schnellste Ausführung einer solchen Anweisung, die Sie erhalten können.

Die Alternative ist JavaScript-Auswertung mit $where. Dies erfordert einen JavaScript-Funktionsausdruck, der in ähnlicher Weise einen true oder false Wert zurückgeben muss. In der Shell können Sie wie dieser Kurzschrift:

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

Die gleiche Sache, mit der Ausnahme, dass JavaScript evalution Interpretation erfordert und viel langsamer als die .aggregate() äquivalent laufen. Aus demselben Grund kann dieser Ausdruckstyp keinen Index zur Optimierung der Leistung verwenden.

Für die besten Ergebnisse, speichern Sie den Unterschied im Dokument. Dann können Sie einfach direkt auf diese Eigenschaft abfragen, und natürlich können Sie sie auch indizieren.

+0

danke für Ihre ausführliche Antwort! Als jemand, der aus SQL kommt, habe ich nicht erwartet, dass es so ausführlich ist ... – zaphod1984

Verwandte Themen