Een aggregatiebewerking verwerkt gegevensrecords en levert berekende resultaten op. Aggregatie bewerkingen groeperen waarden van meerdere documenten samen, en kunnen een verscheidenheid aan bewerkingen uitvoeren op de gegroepeerde gegevens om een enkel resultaat te retourneren. In SQL count(*) en met groep door is een equivalent van MongoDB aggregation.
The aggregate() methode
Voor de aggregatie in MongoDB, moet u aggregate() methode te gebruiken.
Syntax
De basissyntax van de methode aggregate() is als volgt –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Voorbeeld
In de verzameling hebt u de volgende gegevens –
{ _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 uit de bovenstaande verzameling, wilt u een lijst weergeven waarin staat hoeveel zelfstudies door elke gebruiker zijn geschreven, dan gebruikt u de volgende aggregate() methode –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
Sql-equivalente query voor het bovenstaande use-case zal zijn select by_user, count(*) from mycol group by_user.
In het bovenstaande voorbeeld hebben we documenten gegroepeerd per veld by_user en bij elk voorkomen van by user wordt de vorige waarde van de som verhoogd. Hieronder volgt een lijst met beschikbare aggregatie-expressies.
Expression | Description | Example |
---|---|---|
$sum | Telt de gedefinieerde waarde van alle documenten in de verzameling bij elkaar op. | db.mycol.aggregate() |
$avg | Berekent het gemiddelde van alle opgegeven waarden uit alle documenten in de verzameling. | db.mycol.aggregate() |
$min | Haalt het minimum op van de overeenkomstige waarden van alle documenten in de verzameling. | db.mycol.aggregate() |
$max | Haalt het maximum op van de overeenkomstige waarden van alle documenten in de verzameling. | db.mycol.aggregate() |
$push | Voegt de waarde in een array in het resulterende document. | db.mycol.aggregate() |
$addToSet | Slaat de waarde op in een array in het resulterende document, maar maakt geen duplicaten. | db.mycol.aggregate() |
$first | Haalt het eerste document op uit de brondocumenten volgens de groepering. Dit heeft gewoonlijk alleen zin in combinatie met een eerder toegepaste “$sort”-stap. | db.mycol.aggregate() |
$last | Haalt het laatste document op uit de brondocumenten volgens de groepering. Typisch dit heeft alleen zin samen met een aantal eerder toegepaste “$sort”-stage. | db.mycol.aggregate() |
Pipeline Concept
In UNIX commando, shell pijplijn betekent de mogelijkheid om een operatie uit te voeren op een aantal input en gebruik de output als de input voor het volgende commando en ga zo maar door. MongoDB ondersteunt ook hetzelfde concept in aggregatie kader. Er is een set van mogelijke fasen en elk van die wordt genomen als een set van documenten als input en produceert een resulterende set van documenten (of de uiteindelijke resulterende JSON-document aan het eind van de pijplijn). Dit kan dan op zijn beurt worden gebruikt voor de volgende fase, enzovoort.
De volgende zijn de mogelijke fasen in het aggregatiekader –
-
$project – Wordt gebruikt om enkele specifieke velden uit een verzameling te selecteren.
-
$match – Dit is een filterbewerking en kan dus het aantal documenten verminderen dat als invoer voor de volgende stap wordt gegeven.
-
$group – Hiermee wordt de eigenlijke aggregatie uitgevoerd, zoals hierboven besproken.
-
$sort – Sorteert de documenten.
-
$skip – Hiermee is het mogelijk om voor een gegeven aantal documenten vooruit te springen in de lijst met documenten.
-
$limit – Hiermee beperkt u het aantal te bekijken documenten met het opgegeven aantal, beginnend bij de huidige posities.
-
$unwind – Hiermee kunt u documenten afwikkelen die gebruikmaken van een matrix. Wanneer een array wordt gebruikt, worden de gegevens als het ware samengevoegd en deze operatie wordt hiermee ongedaan gemaakt om weer individuele documenten te krijgen. Met deze stap vergroten we dus het aantal documenten voor de volgende stap.