Nejlepší možností je použít $redact
fáze agregačního kanálu:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Takže se díváte na hodnotu v milisekundách, protože rozdíl je větší než hodnota v milisekundách za jeden den. $subtract
provede výpočet rozdílu, a když se odečítají dvě data, vrátí se rozdíl v milisekundách.
$redact
operátor bere logický výraz jako "if" a kde tato podmínka je true
provede akci v "pak", což je $$KEEP
dokument. Kde je false
pak je dokument odstraněn z výsledků pomocí $$PRUNE
.
Všimněte si, že protože se jedná o logickou podmínku a nikoli o nastavenou hodnotu nebo rozsah hodnot, "index" se nepoužívá.
Vzhledem k tomu, že operace v agregačním kanálu jsou nativně kódovány, jde o nejrychlejší provedení takového příkazu, jaké můžete získat.
Alternativou je vyhodnocení JavaScriptu pomocí $where
. To vyžaduje výraz funkce JavaScript, který musí podobně vracet true
nebo false
hodnota. V shellu můžete zkratku takto:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Totéž, až na to, že vyhodnocení JavaScriptu vyžaduje interpretaci a poběží mnohem pomaleji než .aggregate()
ekvivalent. Ze stejného důvodu tento typ výrazu nemůže používat index k optimalizaci výkonu.
Pro nejlepší výsledky, uložte rozdíl do dokumentu. Pak můžete jednoduše dotazovat přímo na tuto vlastnost a samozřejmě ji můžete také indexovat.