Den bedste mulighed er at bruge $redact
aggregeringspipelinestadiet:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Så du ser på millisekunderværdien fra forskellen er større end millisekunderværdien for en dag. $subtract
regner ud for forskellen, og når to datoer trækkes fra, returneres forskellen i millisekunder.
$redact
operatoren tager et logisk udtryk som "hvis", og hvor denne betingelse er true
den udfører handlingen i "then", som er at $$KEEP
dokumentet. Hvor det er false
derefter fjernes dokumentet fra resultaterne med $$PRUNE
.
Bemærk, at da dette er en logisk betingelse og ikke en fast værdi eller et interval af værdier, så bruges et "indeks" ikke.
Da operationerne i aggregeringspipelinen er indbygget kodet, er dette den hurtigste udførelse af en sådan sætning, du dog kan få.
Alternativet er JavaScript-evaluering med $where
. Dette kræver et JavaScript-funktionsudtryk, der på samme måde skal returnere en true
eller false
værdi. I skallen kan du stenografi som denne:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Samme ting, bortset fra at JavaScript-evaluering kræver fortolkning og vil køre meget langsommere end .aggregate()
tilsvarende. På samme måde kan denne type udtryk ikke bruge et indeks til at optimere ydeevnen.
Til det bedste resultater, skal du gemme forskellen i dokumentet. Så kan du blot forespørge direkte på den pågældende ejendom, og du kan selvfølgelig også indeksere den.