sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb aggregerar (räknas) på flera fält samtidigt

Aggregeringsramverket kommer inte att skapa nycklar baserade på data och bör inte heller du gör det till och med eftersom "data" inte är en nyckel utan faktiskt data, så du bör hålla dig till mönstret.

Det betyder att du i princip bara kan göra så här:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }}
])

Och det kommer att räkna förekomsterna per veckodag och händelse, om än i flera dokument i utdata, men detta är lätt att ändra till ett enda dokument per händelse:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }},
    { "$group": {
        "_id": "$_id.event_type",
        "days": { "$push": { "day": "$_id.day", "count": "$count" } }
    }}
])

Och det är i en arrayform, men det håller fortfarande de resultat du vill ha.

Om du verkligen är sugen på att göra din exakta form vill du göra något så här:

db.data.aggregate([
    { "$group": {
        "_id": "$event",
        "1": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 1 ] },
                    1,
                    0
                ]
            }
        },
        "2": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 2 ] },
                    1,
                    0
                ]
            }
        },
        "3": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 3 ] },
                    1,
                    0
                ]
            }
        },
        "4": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 4 ] },
                    1,
                    0
                ]
            }
        },
        "5": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 5 ] },
                    1,
                    0
                ]
            }
        },
        "6": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 6 ] },
                    1,
                    0
                ]
            }
        },
        "7": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 7 ] },
                    1,
                    0
                ]
            }
        }
    }}
)

Men det är väldigt långrandigt så jag skulle IMHO hålla fast vid den första eller kanske andra lösningen eftersom de är kortare och lättare att läsa.



  1. Redis med Resque och Rails:ERR-kommando tillåts inte när minne> 'maxmemory' används

  2. MongoDB och sammansatta primärnycklar

  3. Mongo update array element (.NET drivrutin 2.0)

  4. Välj Max() med grupp efter i mongodb