MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb aggregiert (count) auf mehreren Feldern gleichzeitig

Das Aggregations-Framework erstellt keine Schlüssel basierend auf Daten und sollte es auch nicht Sie tun dies sogar, da "Daten" kein Schlüssel, sondern eigentlich Daten sind, also sollten Sie sich an das Muster halten.

Das heißt, Sie können im Grunde nur Folgendes tun:

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

Und das zählt die Vorkommnisse pro Wochentag pro Ereignis, wenn auch in mehreren Dokumenten in der Ausgabe, aber dies lässt sich leicht in ein einzelnes Dokument pro Ereignis ändern:

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

Und das in Form eines Arrays, aber es enthält immer noch die gewünschten Ergebnisse.

Wenn Sie wirklich darauf aus sind, Ihre genaue Form zu machen, dann sollten Sie so etwas tun:

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

Aber das ist wirklich langatmig, also würde ich IMHO bei der ersten oder vielleicht zweiten Lösung bleiben, da sie kürzer und leichter zu lesen sind.