MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb agrégat (compte) sur plusieurs champs simultanément

Le cadre d'agrégation ne créera pas de clés basées sur les données, et ne devrait pas vous le faites même car les "données" ne sont pas une clé mais en fait des données, vous devez donc vous en tenir au modèle.

Cela signifie que vous pouvez simplement faire ceci :

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

Et cela comptera les occurrences par jour de la semaine et par événement, bien que dans plusieurs documents dans la sortie, mais cela est facile à changer en un seul document par événement :

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

Et c'est sous forme de tableau, mais il contient toujours les résultats que vous voulez.

Si vous êtes vraiment déterminé à faire votre forme exacte, vous voulez faire quelque chose comme ceci :

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

Mais c'est vraiment long, donc à mon humble avis, je m'en tiendrai à la première ou peut-être à la deuxième solution car elles sont plus courtes et plus faciles à lire.