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.