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

Agregovat $group pro více časových období

Musíte podmíněně určit klíč seskupení na základě toho, kde aktuální datum spadá mezi rozsah. Toho je v zásadě dosaženo prostřednictvím $cond s vnořenými podmínkami a logickou variantou $lt :

// work out dates somehow
var today = new Date(),
    oneDay = ( 1000 * 60 * 60 * 24 ),
    thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) ),
    fifteenDays = new Date( today.valueOf() - ( 15 * oneDay ) ),
    sevenDays = new Date( today.valueOf() - ( 7 * oneDay ) );

db.collection.aggregate([
    { "$match": {
        "date": { "$gte": thirtyDays }
    }},
    { "$group": {
        "_id": {
            "$cond": [
                { "$lt": [ "$date", fifteenDays ] },
                "16-30",
                { "$cond": [
                    { "$lt": [ "$date", sevenDays ] },
                    "08-15",
                    "01-07"
                ]}
            ]
        },
        "count": { "$sum": 1 },
        "totalValue": { "$sum": "$value" }
    }}
])

Jako $cond je ternární operátor, první podmínka se vyhodnotí, aby se zjistilo, zda je podmínka pravdivá, a když je pravdivá, vrátí se druhý argument, jinak se vrátí třetí, když je nepravda. Tedy vnořením dalšího $cond ve falešném případě získáte logický test na to, kam datum spadá, buď „méně než 15denní datum“, což znamená, že je v nejstarším rozsahu, nebo „méně než 7 dní“, což znamená střední rozsah, nebo je samozřejmě v nejnovější řada.

Před čísly menšími než 10 uvádím předponu 0 takže vám to dá něco, podle čeho můžete třídit, pokud chcete, protože výstup "klíčů" v $group není samo o sobě uspořádané.

Ale takhle to uděláte v jediném dotazu. Vy pouze zjistíte, jaký by měl být seskupovací klíč na základě toho, kam datum spadá a akumulovat pro každý klíč.



  1. Na OpenShift byla překročena disková kvóta

  2. Mongoose seřadí agregovaný výsledek

  3. Cloudera Impala:Dotazy v reálném čase v Apache Hadoop, ve skutečnosti

  4. Mongo přestal po upgradu fungovat