sql >> Database >  >> NoSQL >> MongoDB

Mongodb-aggregatie (telling) op meerdere velden tegelijk

Het aggregatieraamwerk maakt geen sleutels op basis van gegevens, en zou ook niet je doet dit zelfs omdat "data" geen sleutel is, maar eigenlijk data, dus je moet je aan het patroon houden.

Dat betekent dat je eigenlijk gewoon dit kunt doen:

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

En dat telt de gebeurtenissen per dag van de week per gebeurtenis, zij het in meerdere documenten in de uitvoer, maar dit is eenvoudig te veranderen naar één document per gebeurtenis:

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

En dat is in een matrixvorm, maar het bevat nog steeds de gewenste resultaten.

Als je echt vastbesloten bent om je exacte vorm te doen, dan wil je zoiets als dit doen:

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

Maar dat is echt langdradig, dus IMHO zou ik bij de eerste of misschien tweede oplossing blijven omdat ze korter en gemakkelijker te lezen zijn.



  1. Heeft Meteor een specifieke zoekopdracht voor collecties?

  2. mongodb:hoe kan ik de uitvoeringstijd voor het aggregatiecommando zien?

  3. Meteor - collection.find() retourneert altijd alle velden

  4. Apache CouchDB installeren in Ubuntu 20.04