MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

mongodb:consulta para o período de tempo entre dois campos de data


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.