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

gruppeindsamlingsdata efter flere felter mongodb

Med aggregeringsrammen vil resultatet være lidt anderledes end dit "ønskede" output, da du i stedet for at have hash-nøgler får en række objekter med _id nøgle med en værdi, der repræsenterer dig grupper efter felt. For eksempel i stedet for

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

du ville have en bedre struktur som

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

For at opnå ovenstående resultat ville det kræve brug af $cond operator i $sum akkumulatoroperatør. $cond operatør vil evaluere en logisk betingelse baseret på dets første argument (hvis) og returnerer derefter det andet argument, hvor evalueringen er sand (derefter), eller det tredje argument, hvor falsk (andet). Dette konverterer den sande/falske logik til 1 og 0 numeriske værdier, der føres ind i $sum henholdsvis:

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

Som en resulterende pipeline skal man køre aggregeringsoperationen, som bruger $dateToString operator i _id nøgleudtryk for $gruppe pipeline:

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);
})

Der er dog en mere fleksibel og bedre ydende tilgang, som eksekverer meget hurtigere end ovenstående, hvor den mest effektive datastruktur for dit aggregeringsresultat følger skemaet for eksempel:

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 }
        ]
    }
]

Overvej derefter at køre en alternativ pipeline som følger

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. Hvorfor Mongo Spark connector returnerer forskellige og forkerte tal for en forespørgsel?

  2. Lineær tragt fra en samling begivenheder med MongoDB-aggregering, er det muligt?

  3. Hvordan konverteres JSON-objektstruktur til punktnotation?

  4. Punktnotation vs. $elemMatch