Най-добрият вариант е да използвате $redact
етап на тръбопровод на агрегация:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Така че гледате стойността на милисекунди, като разликата е по-голяма от стойността на милисекунди за един ден. $subtract
прави математиката за разликата и когато се извадят две дати, се връща разликата в милисекунди.
$redact
операторът приема логически израз като "if" и където това условие е true
той предприема действието в "then", което е $$KEEP
Документът. Където е false
след това документът се премахва от резултатите с $$PRUNE
.
Имайте предвид, че тъй като това е логическо условие, а не зададена стойност или диапазон от стойности, тогава „индекс“ не се използва.
Тъй като операциите в конвейера за агрегиране са кодирани по естествен начин, това е най-бързото изпълнение на такъв израз, което можете да получите.
Алтернативата е оценка на JavaScript с $where
. Това отнема израз на функция на JavaScript, който трябва по подобен начин да върне true
или false
стойност. В обвивката можете да съкратите по следния начин:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Същото нещо, с изключение на това, че оценката на JavaScript изисква интерпретация и ще работи много по-бавно от .aggregate()
еквивалентен. По същия начин този тип израз не може да използва индекс за оптимизиране на производителността.
Занай-доброто резултати, съхранете разликата в документа. След това можете просто да направите заявка директно към това свойство и, разбира се, можете също да го индексирате.