MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongodb:query per il periodo di tempo tra due campi di data

L'opzione migliore è usare $redact fase della pipeline di aggregazione:

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

Quindi stai guardando il valore dei millisecondi dalla differenza che è maggiore del valore dei millisecondi per un giorno. Il $subtract fa i calcoli per la differenza e quando vengono sottratte due date viene restituita la differenza in millisecondi.

Il $redact operatore accetta un'espressione logica come "se", e dove quella condizione è true esegue l'azione in "allora" che è $$KEEP il documento. Dove è false quindi il documento viene rimosso dai risultati con $$PRUNE .

Si noti che poiché questa è una condizione logica e non un valore impostato o un intervallo di valori, non viene utilizzato un "indice".

Poiché le operazioni nella pipeline di aggregazione sono codificate in modo nativo, questa è l'esecuzione più veloce di tale istruzione che puoi ottenere.

L'alternativa è la valutazione JavaScript con $where . Questo richiede un'espressione di funzione JavaScript che deve restituire allo stesso modo un true o false valore. Nella shell puoi abbreviare in questo modo:

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

Stessa cosa, tranne per il fatto che la valutazione JavaScript richiede l'interpretazione e verrà eseguita molto più lentamente di .aggregate() equivalente. Allo stesso modo, questo tipo di espressione non può utilizzare un indice per ottimizzare le prestazioni.

Per il meglio risultati, memorizzare la differenza nel documento. Quindi puoi semplicemente eseguire query direttamente su quella proprietà e, naturalmente, puoi anche indicizzarla.