Advertiseringer

Aggregeringsoperationer behandler dataposter og returnerer beregnede resultater. Aggregeringsoperationer grupperer værdier fra flere dokumenter sammen og kan udføre en række forskellige operationer på de grupperede data for at returnere et enkelt resultat. I SQL count(*) og med group by svarer til MongoDB-aggregation.

Metoden aggregate()

Til aggregering i MongoDB skal du bruge aggregate()-metoden.

Syntaks

Basisk syntaks for aggregate() metoden er som følger –

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Eksempel

I opsamlingen har du følgende data –

{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 100},{ _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},

Nu fra ovenstående opsamling, hvis du ønsker at vise en liste med angivelse af, hvor mange tutorials der er skrevet af hver bruger, skal du bruge følgende aggregate()-metode –

> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>

Sql-ækvivalent forespørgsel til ovenstående use case vil være select by_user, count(*) from mycol group by by by_user.

I ovenstående eksempel har vi grupperet dokumenter efter feltet by_user, og ved hver forekomst af by user øges den tidligere værdi af summen. Følgende er en liste over tilgængelige aggregeringsudtryk:

Udtryk Beskrivelse Eksempel
$sum Summerer den definerede værdi fra alle dokumenter i samlingen. db.mycol.aggregate()
$avg Beregner gennemsnittet af alle angivne værdier fra alle dokumenter i samlingen. db.mycol.aggregate()
$min Henter det mindste af de tilsvarende værdier fra alle dokumenter i samlingen. db.mycol.aggregate()
$max Henter maksimum af de tilsvarende værdier fra alle dokumenter i samlingen. db.mycol.aggregate()
$push Indsætter værdien til et array i det resulterende dokument. db.mycol.aggregate()
$addToSet Indsætter værdien i et array i det resulterende dokument, men opretter ikke dubletter. db.mycol.aggregate()
$first Henter det første dokument fra kildedokumenterne i overensstemmelse med grupperingen. Typisk giver dette kun mening sammen med et tidligere anvendt “$sort”-trin. db.mycol.aggregate()
$last Henter det sidste dokument fra kildedokumenterne i henhold til grupperingen. Typisk giver dette kun mening sammen med nogle tidligere anvendte “$sort”-stage. db.mycol.aggregate()

Pipeline-begrebet

I UNIX-kommando betyder shell-pipeline muligheden for at udføre en operation på noget input og bruge output som input til den næste kommando og så videre. MongoDB understøtter også det samme koncept i aggregationsrammen. Der er et sæt mulige stadier, og hvert af disse tages som et sæt dokumenter som input og producerer et resulterende sæt dokumenter (eller det endelige resulterende JSON-dokument i slutningen af pipelinen). Dette kan så igen bruges til det næste trin og så videre.

Følgende er de mulige trin i aggregeringsrammen –

  • $project – Bruges til at vælge nogle specifikke felter fra en samling.

  • $match – Dette er en filtreringsoperation, og dermed kan dette reducere mængden af dokumenter, der gives som input til næste trin.

  • $group – Dette foretager den egentlige aggregering som beskrevet ovenfor.

  • $sort – Sorterer dokumenterne.

  • $skip – Med dette er det muligt at springe fremad i listen over dokumenter for en given mængde dokumenter.

  • $limit – Dette begrænser mængden af dokumenter, der skal kigges på, med det givne antal ud fra de aktuelle positioner.

  • $unwind – Dette bruges til at afvikle dokument, der bruger arrays. Når der bruges et array, er dataene på en måde pre-joined, og denne operation vil blive fortrykt med dette for at få individuelle dokumenter igen. Med denne fase vil vi således øge mængden af dokumenter til den næste fase.

Aviser

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.