MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

mongodb :requête pour la période de temps entre deux champs de date

La meilleure option est d'utiliser le $redact étape du pipeline d'agrégation :

db.collection.aggregate([
    { "$redact": {
        "$cond": {
            "if": {
                "$gt": [
                    { "$subtract": [ "$lastUpdate", "$createdDate" ] },
                    1000 * 60 * 60 * 24
                ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Donc, vous regardez la valeur en millisecondes de la différence étant supérieure à la valeur en millisecondes pour un jour. Le $subtract fait le calcul pour la différence, et lorsque deux dates sont soustraites, la différence en millisecondes est renvoyée.

Le $redact l'opérateur prend une expression logique comme "if", et où cette condition est true il prend l'action dans "then" qui est de $$KEEP le document. Où c'est false puis le document est supprimé des résultats avec $$PRUNE .

Notez que puisqu'il s'agit d'une condition logique et non d'une valeur définie ou d'une plage de valeurs, un "index" n'est pas utilisé.

Étant donné que les opérations du pipeline d'agrégation sont codées de manière native, il s'agit de l'exécution la plus rapide d'une telle instruction que vous puissiez obtenir.

L'alternative est l'évaluation JavaScript avec $where . Cela prend une expression de fonction JavaScript qui doit de la même manière renvoyer un true ou false valeur. Dans le shell, vous pouvez raccourcir comme ceci :

db.collection.find(function() {
    return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
       > ( 1000 * 60 * 60 * 24 );
})

Même chose, sauf que l'évaluation JavaScript nécessite une interprétation et s'exécutera beaucoup plus lentement que le .aggregate() équivalent. De même, ce type d'expression ne peut pas utiliser d'index pour optimiser les performances.

Pour le meilleur résultats, enregistrez la différence dans le document. Ensuite, vous pouvez simplement interroger directement cette propriété et, bien sûr, vous pouvez également l'indexer.