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

Behov for at finde den hyppigst forekommende værdi af et felt i et aggregat

Nå, du kan ikke bare "sminke". operatorer som $mode er ikke en aggregeringsoperatør, og de eneste ting, du kan bruge, er dem, der faktisk eksisterer .

Så for at returnere kategoriværdien inden for den grupperede tidsperiode, der forekommer mest, er det nødvendigt at gruppere først på hver af disse værdier og returnere antallet af forekomster. Derefter kan du sortere disse resultater efter det antal og returnere den kategoriværdi, der registrerede det højeste antal inden for denne periode:

    // Filter dates
    { "$match": { 
        "dt": { 
            "$gt": new Date("October 13, 2010 12:00:00"), 
            "$lt": new Date("November 13, 2010 12:00:00")
        } 
    }},

    // Group by hour and category, with avg and count
    { "$group": {
        "_id": {
            "dt": {
                "$add": [
                    {
                        "$subtract": [
                            { "$subtract": ["$dt", new Date(0)] },
                            {
                                "$mod": [
                                    { "$subtract": ["$dt", new Date(0)] },
                                    3600000//1000 * 60 * 60
                                ]
                            }
                        ]
                    },
                    new Date(0)
                ]
            },
            "category": "$category"
        }, 
        "price": { "$avg": "$price" },
        "count": { "$sum": 1 }
    }},
    // Sort on date and count
    { "$sort": { "_id.dt": 1, "count": -1 }},

    // Group on just the date, keeping the avg and the first category
    { "$group": {
        "_id": "$_id.dt",
        "price": { "$avg": "$price"}
        "category": { "$first": "$_id.category" }
    }}

$group på både dato og kategori og behold kategoriantallet via $sum . Så skal du $sort så den største "tælling" er øverst for hver grupperet dato. Og brug endelig $first når du anvender en anden $group som blot anvendes på selve datoen for at returnere den kategori med det største antal for hver dato.

Lad dig ikke friste af operatører som $max da de ikke virker her. Den vigtigste forskel er den "bundne" relation til "posten/dokumentet" produceret for hver kategoriværdi. Det er altså ikke det maksimale "antal" du ønsker eller den maksimale "kategori"-værdi, men derimod den kategoriværdi, der "producerede" det største antal. Derfor er der en $sort nødvendigt her.

Til sidst nogle vaner du "bør" bryde:

  • Brug ikke datoforekomstdata uden UTC-format som input, medmindre du virkelig ved, hvad du laver. Datoer vil altid blive konverteret til UTC, så i det mindste i testlister bør du vænne dig til at angive datoværdien på den måde.

  • Det ser måske lidt renere ud den anden vej, men ting som 1000 * 60 * 60 er meget mere beskrivende kode for, hvad den gør end 3600000 . Samme værdi, men én form er vejledende for dets tidsenheder på et øjeblik.

  • Sammensætning af _id når der kun er en enkelt værdi kan også forvirre problemer. Så der er ingen mening i at få adgang til _id.dt hvis det var den eneste værdi til stede. Hvornår er mere end en enkelt egenskab inden for _id så er det fint. Men enkelte værdier skal bare tildeles lige tilbage til _id alene. Intet vundet ellers, og single er helt klart.




  1. Hvad er den anbefalede tilgang til databaser med flere lejere i MongoDB?

  2. Adgangselement i mongo array i java

  3. MongoDB - Kommentar Upvoting/Downvoting med Aggregation Pipeline

  4. Fjern dubletter på mongodb