sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur räknar jag flera nycklar i samma MongoDB aggregerade $group-fråga?

Det finns några olika tillvägagångssätt du kan använda här:

  1. Använd kartlägga/förminska:gör inte detta. Just nu skulle det vara mycket snabbare att köra aggregeringsramverket 3 gånger än att använda en kartreduceringsfunktion för detta användningsfall.

  2. Kör aggregering 3 gånger. Detta är inte optimalt, men om du inte har tidsbrist så är detta det enklaste alternativet. Om dina sammanställningar tar

  3. Här är den bästa lösningen jag kan tänka mig. $group operatorn låter dig bygga ett _id på flera fält. T.ex. {"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}} . Genom att göra detta skapas en gruppering för alla befintliga kombinationer av dina olika nycklar. Du kan potentiellt gruppera dina nycklar på detta sätt och sedan manuellt summera resultaten i klienten.

Låt mig utveckla. Låt oss säga att vi har en samling former. Dessa former kan ha en färg, en storlek och en typ (fyrkant, cirkel, etc). En aggregering på ett multinyckel-ID kan se ut så här:

db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})

och returnera:

"result" : [
        {
            "_id" : {
                "f1" : "yellow",
                "f2" : "medium",
                "f3" : "triangle"
            },
            "count" : 4086
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "small",
                "f3" : "triangle"
            },
            "count" : 4138
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "big",
                "f3" : "square"
            },
            "count" : 4113
        },
        {
            "_id" : {
                "f1" : "yellow",
                "f2" : "small",
                "f3" : "triangle"
            },
            "count" : 4145
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "small",
                "f3" : "square"
            },
            "count" : 4062
        }

... och så vidare

Du skulle sedan summera resultaten på klientsidan, över ett drastiskt minskat antal poster. Om du antar att antalet unika värden för varje nyckel är tillräckligt litet jämfört med det totala antalet dokument, kan du göra detta sista steg på en försumbar tid.




  1. Mongodb, grupp efter datediff och få timme

  2. Hur utför man sådana filterfrågor i mongoengine på kapslade dicts eller arrayer som finns i dict med python?

  3. Vad är skillnaden mellan COUNT_SCAN och IXSCAN?

  4. Hur man utvecklar applikationer för MongoDB och Redpanda med Docker Compose