De beste optie is om de $redact
. te gebruiken aggregatiepijplijnfase:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
U kijkt dus naar de millisecondenwaarde waarbij het verschil groter is dan de millisecondenwaarde voor één dag. De $subtract
doet de wiskunde voor het verschil, en wanneer twee datums worden afgetrokken, wordt het verschil in milliseconden geretourneerd.
De $redact
operator neemt een logische uitdrukking als "if", en waar die voorwaarde true
is het voert de actie uit in "then", namelijk $$KEEP
het document. Waar is het false
dan wordt het document uit de resultaten verwijderd met $$PRUNE
.
Merk op dat aangezien dit een logische voorwaarde is en geen ingestelde waarde of een reeks waarden, er geen "index" wordt gebruikt.
Omdat de bewerkingen in de aggregatiepijplijn native gecodeerd zijn, is dit de snelste uitvoering van een dergelijke instructie die je kunt krijgen.
Het alternatief is JavaScript-evaluatie met $where
. Hiervoor is een JavaScript-functie-expressie nodig die op dezelfde manier een true
. moet retourneren of false
waarde. In de shell kun je dit als volgt afkorten:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Hetzelfde, behalve dat JavaScript-evaluatie interpretatie vereist en veel langzamer zal verlopen dan de .aggregate()
gelijkwaardig. Op dezelfde manier kan dit type expressie geen index gebruiken om de prestaties te optimaliseren.
Voor de beste resultaten, slaat u het verschil op in het document. Dan kunt u eenvoudig rechtstreeks op die eigenschap zoeken en u kunt deze natuurlijk ook indexeren.