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

mongodb:forespørgsel efter tidsperioden mellem to datofelter

Den bedste mulighed er at bruge $redact aggregeringspipelinestadiet:

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

Så du ser på millisekunderværdien fra forskellen er større end millisekunderværdien for en dag. $subtract regner ud for forskellen, og når to datoer trækkes fra, returneres forskellen i millisekunder.

$redact operatoren tager et logisk udtryk som "hvis", og hvor denne betingelse er true den udfører handlingen i "then", som er at $$KEEP dokumentet. Hvor det er false derefter fjernes dokumentet fra resultaterne med $$PRUNE .

Bemærk, at da dette er en logisk betingelse og ikke en fast værdi eller et interval af værdier, så bruges et "indeks" ikke.

Da operationerne i aggregeringspipelinen er indbygget kodet, er dette den hurtigste udførelse af en sådan sætning, du dog kan få.

Alternativet er JavaScript-evaluering med $where . Dette kræver et JavaScript-funktionsudtryk, der på samme måde skal returnere en true eller false værdi. I skallen kan du stenografi som denne:

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

Samme ting, bortset fra at JavaScript-evaluering kræver fortolkning og vil køre meget langsommere end .aggregate() tilsvarende. På samme måde kan denne type udtryk ikke bruge et indeks til at optimere ydeevnen.

Til det bedste resultater, skal du gemme forskellen i dokumentet. Så kan du blot forespørge direkte på den pågældende ejendom, og du kan selvfølgelig også indeksere den.



  1. Hvordan udfører man Persistence Store i Redis?

  2. Python Reddis Queue ValueError:Funktioner fra __main__-modulet kan ikke behandles af arbejdere

  3. Find duplikerede poster i MongoDB

  4. MongoDB $round vs $trunc:Hvad er forskellen?