A melhor opção é usar o
$redact
estágio do pipeline de agregação:db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Então você está olhando para o valor de milissegundos da diferença sendo maior que o valor de milissegundos para um dia. O
$subtract
faz as contas da diferença e, quando duas datas são subtraídas, a diferença em milissegundos é retornada. O
$redact
operador recebe uma expressão lógica como "if", e onde essa condição é true
ele toma a ação em "then" que é $$KEEP
o documento. Onde é false
então o documento é removido dos resultados com $$PRUNE
. Observe que, como essa é uma condição lógica e não um valor definido ou um intervalo de valores, um "índice" não é usado.
Como as operações no pipeline de agregação são codificadas nativamente, essa é a execução mais rápida dessa instrução que você pode obter.
A alternativa é a avaliação JavaScript com
$where
. Isso leva uma expressão de função JavaScript que precisa retornar de forma semelhante um true
ou false
valor. No shell você pode abreviar assim:db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Mesma coisa, exceto que a avaliação JavaScript requer interpretação e será muito mais lenta que o
.aggregate()
equivalente. Da mesma forma, esse tipo de expressão não pode usar um índice para otimizar o desempenho. Para o melhor resultados, armazene a diferença no documento. Em seguida, você pode simplesmente consultar diretamente nessa propriedade e, claro, também pode indexá-la.