sql >> Databáze >  >> NoSQL >> MongoDB

Mongodb agreguje (počítá) na více polích současně

Rámec agregace nevytváří klíče na základě dat a ani by neměl dokonce to děláte, protože „data“ nejsou klíč, ale ve skutečnosti data, takže byste se měli držet vzoru.

To znamená, že v podstatě můžete udělat toto:

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

A to bude počítat výskyty za den v týdnu na událost, i když ve více dokumentech na výstupu, ale to lze snadno změnit na jeden dokument na událost:

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

A to je ve formě pole, ale stále obsahuje požadované výsledky.

Pokud jste opravdu odhodláni udělat svou přesnou formu, pak chcete udělat něco takového:

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

Ale to je opravdu dlouhé, takže IMHO bych zůstal u prvního nebo možná druhého řešení, protože jsou kratší a snadněji čitelné.



  1. Keras předpovídá, že se nevrátí do celerové úlohy

  2. Jak psát unijní dotazy v mongoDB

  3. Spring Boot s chybou serializace relace/Redis se špatnými pověřeními Ldap Active Directory

  4. Jak ClusterControl provádí automatickou obnovu databáze a převzetí služeb při selhání