sql >> Databáze >  >> NoSQL >> MongoDB

mongodb:dotaz na časové období mezi dvěma datovými poli

Nejlepší možností je použít $redact fáze agregačního kanálu:

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

Takže se díváte na hodnotu v milisekundách, protože rozdíl je větší než hodnota v milisekundách za jeden den. $subtract provede výpočet rozdílu, a když se odečítají dvě data, vrátí se rozdíl v milisekundách.

$redact operátor bere logický výraz jako "if" a kde tato podmínka je true provede akci v "pak", což je $$KEEP dokument. Kde je false pak je dokument odstraněn z výsledků pomocí $$PRUNE .

Všimněte si, že protože se jedná o logickou podmínku a nikoli o nastavenou hodnotu nebo rozsah hodnot, "index" se nepoužívá.

Vzhledem k tomu, že operace v agregačním kanálu jsou nativně kódovány, jde o nejrychlejší provedení takového příkazu, jaké můžete získat.

Alternativou je vyhodnocení JavaScriptu pomocí $where . To vyžaduje výraz funkce JavaScript, který musí podobně vracet true nebo false hodnota. V shellu můžete zkratku takto:

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

Totéž, až na to, že vyhodnocení JavaScriptu vyžaduje interpretaci a poběží mnohem pomaleji než .aggregate() ekvivalent. Ze stejného důvodu tento typ výrazu nemůže používat index k optimalizaci výkonu.

Pro nejlepší výsledky, uložte rozdíl do dokumentu. Pak můžete jednoduše dotazovat přímo na tuto vlastnost a samozřejmě ji můžete také indexovat.



  1. pomocí řetězce pro mongodb _id

  2. Hadoop MapReduce Diagram průběhu provádění úloh

  3. Python + Memcached:Efektivní ukládání do mezipaměti v distribuovaných aplikacích

  4. Jak obnovit konkrétní kolekci v MongoDB pomocí logického zálohování