sql >> Database >  >> NoSQL >> MongoDB

mongodb:vraag naar de tijdsperiode tussen twee datumvelden

De beste optie is om de $redact . te gebruiken aggregatiepijplijnfase:

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

U kijkt dus naar de millisecondenwaarde waarbij het verschil groter is dan de millisecondenwaarde voor één dag. De $subtract doet de wiskunde voor het verschil, en wanneer twee datums worden afgetrokken, wordt het verschil in milliseconden geretourneerd.

De $redact operator neemt een logische uitdrukking als "if", en waar die voorwaarde true is het voert de actie uit in "then", namelijk $$KEEP het document. Waar is het false dan wordt het document uit de resultaten verwijderd met $$PRUNE .

Merk op dat aangezien dit een logische voorwaarde is en geen ingestelde waarde of een reeks waarden, er geen "index" wordt gebruikt.

Omdat de bewerkingen in de aggregatiepijplijn native gecodeerd zijn, is dit de snelste uitvoering van een dergelijke instructie die je kunt krijgen.

Het alternatief is JavaScript-evaluatie met $where . Hiervoor is een JavaScript-functie-expressie nodig die op dezelfde manier een true . moet retourneren of false waarde. In de shell kun je dit als volgt afkorten:

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

Hetzelfde, behalve dat JavaScript-evaluatie interpretatie vereist en veel langzamer zal verlopen dan de .aggregate() gelijkwaardig. Op dezelfde manier kan dit type expressie geen index gebruiken om de prestaties te optimaliseren.

Voor de beste resultaten, slaat u het verschil op in het document. Dan kunt u eenvoudig rechtstreeks op die eigenschap zoeken en u kunt deze natuurlijk ook indexeren.



  1. Mongo-cxx-driver bouwen met CMake ExternalProject_Add

  2. Wanneer moet u de MongoDB-databaseverbinding in Nodejs sluiten

  3. Hoe maak ik verbinding met mongodb met node.js (en authenticeer ik)?

  4. Moet `StackExchange.Redis.ConnectionMultiplexer` `AddSingleton` of `AddScope` zijn in .NET Core-afhankelijkheidsinjectie?