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

skupina sběr dat podle více polí mongodb

S agregačním rámcem se bude výsledek mírně lišit od vašeho „požadovaného“ výstupu, protože místo hash klíčů získáte pole objektů s _id klíč s hodnotou, která vás představuje skupinu po poli. Například místo

{
    "28-10-2016":{
        "success_count": 10, 
        "failure_count": 10
    },
    "29-10-2016": {
        "success_count": 10, 
        "failure_count": 10
    }
}

měli byste lepší strukturu jako

[
    {
        "_id": "28-10-2016",
        "success_count": 10, 
        "failure_count": 10
    },
        "_id": "29-10-2016",
        "success_count": 10, 
        "failure_count": 10
    }
]

Dosažení výše uvedeného výsledku by vyžadovalo použití $cond operátor v $sum provozovatel akumulátoru. $cond operátor vyhodnotí logickou podmínku na základě jejího prvního argumentu (if) a poté vrátí druhý argument, pokud je vyhodnocení pravdivé (pak) nebo třetí argument, pokud je nepravda (else). Tím se logika pravda/nepravda převede na číselné hodnoty 1 a 0, které se převedou do $sum respektive:

"success_count": {
    "$sum": {
        "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
    }
}

Jako výsledný kanál je třeba spustit operaci agregace, která používá $dateToString operátor v _id klíčový výraz pro $group potrubí:

Orders.aggregate([
    {
        "$group": {
            "_id": {
                "$dateToString": { 
                    "format": "%Y-%m-%d", 
                    "date": "$created_at" 
                }
            },
            "success_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
                }
            },
            "failure_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})

Existuje však flexibilnější a výkonnější přístup, který se provádí mnohem rychleji než výše uvedený, kde nejúčinnější datová struktura pro váš výsledek agregace následuje například schéma:

orders = [
    {
        "_id": "28-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    },
    {
        "_id": "29-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    }
]

Poté zvažte spuštění alternativního kanálu následujícím způsobem

Orders.aggregate([
    { 
        "$group": {
            "_id": { 
                "date":  {
                    "$dateToString": { 
                        "format": "%Y-%m-%d", 
                        "date": "$created_at" 
                    }
                },
                "status": { "$toLower": "$status" }
            },
            "count": { "$sum": 1 }
        }
    },
    { 
        "$group": {
            "_id": "$_id.date",
            "counts": {
                "$push": {
                    "status": "$_id.status",
                    "count": "$count"
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})



  1. Jak ovládat velikost žurnálů v mongodb?

  2. Může mongorestore převzít jeden argument adresy URL místo samostatných argumentů?

  3. Získání chyby v problému přetypování mongodb pro platné ID objektu

  4. MongoDB:find and findOne s filtrováním vnořených polí