Najlepszą opcją jest użycie $redact
etap potoku agregacji:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Więc patrzysz na wartość w milisekundach z różnicy, która jest większa niż wartość w milisekundach dla jednego dnia. $subtract
oblicza różnicę, a gdy odejmuje się dwie daty, zwracana jest różnica w milisekundach.
$redact
operator przyjmuje logiczne wyrażenie jako „jeśli”, a warunek jest true
wykonuje akcję w "then", czyli $$KEEP
dokument. Gdzie to jest false
następnie dokument jest usuwany z wyników za pomocą $$PRUNE
.
Zwróć uwagę, że ponieważ jest to warunek logiczny, a nie ustawiona wartość lub zakres wartości, „indeks” nie jest używany.
Ponieważ operacje w potoku agregacji są kodowane natywnie, jest to najszybsze wykonanie takiej instrukcji, jakie można uzyskać.
Alternatywą jest ocena JavaScript z $where
. Pobiera to wyrażenie funkcji JavaScript, które podobnie musi zwracać true
lub false
wartość. W powłoce możesz użyć skrótu w ten sposób:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
To samo, z wyjątkiem tego, że ewaluacja JavaScript wymaga interpretacji i będzie działać znacznie wolniej niż .aggregate()
równowartość. Z tego samego powodu ten typ wyrażenia nie może używać indeksu do optymalizacji wydajności.
Dla najlepszych wyniki, zapisz różnicę w dokumencie. Następnie możesz po prostu zapytać bezpośrednio o tę właściwość i oczywiście możesz ją również zindeksować.