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

Mongodb samler (tæller) på flere felter samtidigt

Aggregeringsrammen vil ikke skabe nøgler baseret på data, og det skal heller ikke du gør det endda, da "data" ikke er en nøgle, men faktisk data, så du bør holde dig til mønsteret.

Det betyder, at du stort set bare kan gøre dette:

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

Og det vil tælle forekomsterne pr. ugedag pr. begivenhed, dog i flere dokumenter i outputtet, men det er nemt at ændre til et enkelt dokument pr. begivenhed:

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

Og det er i en matrixform, men det holder stadig de resultater, du ønsker.

Hvis du virkelig er indstillet på at lave din nøjagtige form, vil du gerne gøre noget som dette:

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 er virkelig langtrukkent, så IMHO ville jeg holde mig til den første eller måske anden løsning, da de er kortere og nemmere at læse.



  1. Node mongoose find forespørgsel i loop virker ikke

  2. Meteor - collection.find() returnerer altid alle felter

  3. Kan ikke installere mongodb doktrin i symfony2 med komponist

  4. Sådan migreres Redis™-data ved hjælp af Redis-Shake