sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb:fråga för tidsperioden mellan två datumfält

Det bästa alternativet är att använda $redact aggregeringspipeline:

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

Så du tittar på millisekundersvärdet från att skillnaden är större än millisekundersvärdet för en dag. $subtract räknar ut skillnaden, och när två datum subtraheras returneras skillnaden i millisekunder.

$redact operatorn tar ett logiskt uttryck som "om", och där det villkoret är true den vidtar åtgärden i "då" som är att $$KEEP dokumentet. Där det är false då tas dokumentet bort från resultaten med $$PRUNE .

Observera att eftersom detta är ett logiskt villkor och inte ett inställt värde eller ett värdeintervall, används inte ett "index".

Eftersom operationerna i aggregeringspipelinen är inbyggt kodade är detta den snabbaste exekveringen av en sådan sats som du kan få dock.

Alternativet är JavaScript-utvärdering med $where . Detta kräver ett JavaScript-funktionsuttryck som på liknande sätt måste returnera en true eller false värde. I skalet kan du stenografi så här:

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

Samma sak, förutom att JavaScript-utvärdering kräver tolkning och kommer att köras mycket långsammare än .aggregate() likvärdig. På samma sätt kan den här typen av uttryck inte använda ett index för att optimera prestanda.

För det bästa resultat lagrar du skillnaden i dokumentet. Sedan kan du helt enkelt fråga direkt på den egenskapen, och naturligtvis kan du indexera den också.



  1. RDBTools har köpts upp av RedisLabs!

  2. MongoDB $mod

  3. Komma igång med MongoDB Go-drivrutinen

  4. Installera phpredis MAC OSX