Det bästa alternativet är att använda $redact
aggregeringspipeline:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Så du tittar på millisekundersvärdet från att skillnaden är större än millisekundersvärdet för en dag. $subtract
räknar ut skillnaden, och när två datum subtraheras returneras skillnaden i millisekunder.
$redact
operatorn tar ett logiskt uttryck som "om", och där det villkoret är true
den vidtar åtgärden i "då" som är att $$KEEP
dokumentet. Där det är false
då tas dokumentet bort från resultaten med $$PRUNE
.
Observera att eftersom detta är ett logiskt villkor och inte ett inställt värde eller ett värdeintervall, används inte ett "index".
Eftersom operationerna i aggregeringspipelinen är inbyggt kodade är detta den snabbaste exekveringen av en sådan sats som du kan få dock.
Alternativet är JavaScript-utvärdering med $where
. Detta kräver ett JavaScript-funktionsuttryck som på liknande sätt måste returnera en true
eller false
värde. I skalet kan du stenografi så här:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Samma sak, förutom att JavaScript-utvärdering kräver tolkning och kommer att köras mycket långsammare än .aggregate()
likvärdig. På samma sätt kan den här typen av uttryck inte använda ett index för att optimera prestanda.
För det bästa resultat lagrar du skillnaden i dokumentet. Sedan kan du helt enkelt fråga direkt på den egenskapen, och naturligtvis kan du indexera den också.