Ag­gre­ga­tie in MongoDB is een waardevol hulp­mid­del voor het ana­ly­se­ren en filteren van databases. Het pijp­lijn­sys­teem maakt het mogelijk om query’s te spe­ci­fi­ce­ren, waardoor zeer ge­per­so­na­li­seer­de outputs mogelijk zijn.

Wat is ag­gre­ga­tie in MongoDB?

MongoDB is een niet-re­la­ti­o­ne­le en do­cu­ment­ge­o­ri­ën­teer­de database die is ontworpen voor gebruik met grote en diverse hoe­veel­he­den gegevens. Door af te zien van rigide tabellen en tech­nie­ken zoals sharding (het opslaan van gegevens op ver­schil­len­de knoop­pun­ten) te gebruiken, kan de NoSQL-oplossing ho­ri­zon­taal worden geschaald en te­ge­lij­ker­tijd zeer flexibel en bestand tegen storingen blijven.

Do­cu­men­ten in het binaire JSON-formaat BSON worden gebundeld in col­lec­ties en kunnen worden op­ge­vraagd en bewerkt met behulp van de MongoDB Query Language (MQL). Hoewel deze taal veel mo­ge­lijk­he­den biedt, is hij niet geschikt (of misschien niet geschikt genoeg) voor ge­ge­vens­ana­ly­se. Daarom biedt MongoDB ag­gre­ga­tie.

In de in­for­ma­ti­ca verwijst deze term naar ver­schil­len­de processen. In MongoDB verwijst ag­gre­ga­tie naar het ana­ly­se­ren en sa­men­vat­ten van gegevens met behulp van ver­schil­len­de be­wer­kin­gen om één duidelijk resultaat te ver­krij­gen. Tijdens dit proces worden gegevens uit één of meer do­cu­men­ten ge­a­na­ly­seerd en gefilterd op basis van door de gebruiker ge­de­fi­ni­eer­de factoren.

In de volgende pa­ra­gra­fen bekijken we niet alleen de mo­ge­lijk­he­den die MongoDB-ag­gre­ga­tie biedt voor uit­ge­brei­de ge­ge­vens­ana­ly­se, maar geven we ook voor­beel­den van hoe u de aggregate ( ) kunt gebruiken met een da­ta­ba­se­be­heer­sys­teem.

Wat heb ik nodig voor MongoDB-ag­gre­ga­tie?

Er zijn slechts enkele vereisten voor het gebruik van ag­gre­ga­tie in MongoDB. De methode wordt uit­ge­voerd in de shell en werkt volgens logische regels die u kunt aanpassen aan de behoeften van uw analyse.

Om ag­gre­ga­tie in Mongo DB te kunnen gebruiken, moet MongoDB al op uw computer zijn ge­ïn­stal­leerd. Als dat niet het geval is, kunt u in onze uit­ge­brei­de MongoDB-hand­lei­ding lezen hoe u de database kunt down­lo­a­den, in­stal­le­ren en uitvoeren.

U moet ook een krachtige firewall gebruiken en ervoor zorgen dat uw database is ingesteld volgens alle huidige be­vei­li­gings­nor­men. Om ag­gre­ga­tie in MongoDB uit te voeren, moet u be­heer­ders­rech­ten hebben.

De database werkt op alle platforms, dus de hieronder be­schre­ven stappen zijn van toe­pas­sing op alle be­stu­rings­sys­te­men.

Wat is de pijplijn in het MongoDB-ag­gre­ga­tiefra­me­work?

In MongoDB kunt u een­vou­di­ge zoek­op­drach­ten of query’s uitvoeren, waarbij de database on­mid­del­lijk de re­sul­ta­ten weergeeft. Deze methode is echter zeer beperkt, omdat alleen re­sul­ta­ten kunnen worden weer­ge­ge­ven die al in de op­ge­sla­gen do­cu­men­ten aanwezig zijn. Dit type query is niet bedoeld voor diep­gaan­de analyses, te­rug­ke­ren­de patronen of het afleiden van verdere in­for­ma­tie.

Soms moet rekening worden gehouden met ver­schil­len­de bronnen binnen een database om zinvolle con­clu­sies te kunnen trekken. MongoDB-ag­gre­ga­tie wordt gebruikt voor dit soort situaties. Om der­ge­lij­ke re­sul­ta­ten te bereiken, maakt de aggregate ( ) gebruik van pijp­lij­nen.

De rol van de pijp­lei­ding

Ag­gre­ga­tie­pijp­lij­nen in MongoDB zijn processen waarbij bestaande gegevens worden ge­a­na­ly­seerd en gefilterd met behulp van ver­schil­len­de stappen om het resultaat weer te geven waarnaar ge­brui­kers op zoek zijn. Deze stappen worden fasen genoemd. Af­han­ke­lijk van de vereisten kunnen een of meer fasen worden gestart. Deze worden na elkaar uit­ge­voerd en wijzigen uw oor­spron­ke­lij­ke invoer, zodat de uitvoer (de in­for­ma­tie waarnaar u op zoek bent) aan het einde kan worden weer­ge­ge­ven.

Hoewel de input uit talrijke gegevens bestaat, is de output (d.w.z. het eind­re­sul­taat) en­kel­vou­dig. We zullen de ver­schil­len­de fasen van MongoDB-ag­gre­ga­tie later in dit hoofdstuk toe­lich­ten.

Syntaxis van de MongoDB-ag­gre­ga­tie­pijp­lijn

Al­ler­eerst is het de moeite waard om even te kijken naar de syntaxis van ag­gre­ga­tie in MongoDB. De methode is altijd volgens hetzelfde formaat ge­struc­tu­reerd en kan worden aangepast aan uw spe­ci­fie­ke vereisten. De ba­sis­struc­tuur ziet er als volgt uit:

db.collection_name.aggregate ( pipeline, options )
shell

Hier is collection_name de naam van de be­tref­fen­de collectie. De fasen van MongoDB-ag­gre­ga­tie worden vermeld onder pipeline. options kan worden gebruikt voor verdere optionele pa­ra­me­ters die de uitvoer de­fi­ni­ë­ren.

Pijp­lijn­fa­sen

Er zijn talrijke fasen voor de ag­gre­ga­tie­pijp­lijn in MongoDB. De meeste daarvan kunnen meerdere keren binnen een pijplijn worden gebruikt. Het zou het bestek van dit artikel te buiten gaan om hier alle opties op te sommen, vooral omdat sommige alleen voor zeer spe­ci­fie­ke be­wer­kin­gen nodig zijn. Om u echter een idee te geven van de fasen, noemen we hier een paar van de meest gebruikte:

  • $count: Deze fase geeft u een indicatie van hoeveel BSON-do­cu­men­ten in aan­mer­king zijn genomen voor de fase of fasen in de pijplijn.
  • $group: Deze fase sorteert en bundelt do­cu­men­ten op basis van bepaalde pa­ra­me­ters.
  • $limit: Beperkt het aantal do­cu­men­ten dat wordt door­ge­ge­ven aan de volgende fase in de pijplijn.
  • $match: Met de $match-fase beperkt u de do­cu­men­ten die voor de volgende fase worden gebruikt.
  • $out: Deze fase wordt gebruikt om de re­sul­ta­ten van de MongoDB-ag­gre­ga­tie in de collectie op te nemen. Deze fase kan alleen aan het einde van een pijplijn worden gebruikt.
  • $project: Gebruik $project om spe­ci­fie­ke velden uit een ver­za­me­ling te se­lec­te­ren.
  • $skip: Deze fase negeert een bepaald aantal do­cu­men­ten. U kunt dit spe­ci­fi­ce­ren met een optie.
  • $sort: Deze bewerking sorteert de do­cu­men­ten in de collectie van de gebruiker. De do­cu­men­ten worden echter verder niet gewijzigd.
  • $unset: $unset sluit bepaalde velden uit. Het doet het te­gen­over­ge­stel­de van wat $project doet.

Een voorbeeld van ag­gre­ga­tie in MongoDB

Om u te helpen beter te begrijpen hoe ag­gre­ga­tie in MongoDB werkt, laten we u enkele voor­beel­den zien van ver­schil­len­de fasen en hoe u deze kunt gebruiken. Om MongoDB-ag­gre­ga­tie te gebruiken, opent u de shell als beheerder. Normaal gesproken wordt eerst een test­da­ta­ba­se weer­ge­ge­ven. Als u een andere database wilt gebruiken, gebruikt u het commando use.

Laten we voor dit voorbeeld eens kijken naar een database met gegevens van klanten die een bepaald product hebben gekocht. Om het simpel te houden, heeft deze database maar tien do­cu­men­ten, die allemaal hetzelfde zijn opgebouwd:

{
	"name" : "Smith",
	"city" : "Glasgow",
	"country" : "Scotland",
	"quantity" : 14
}
shell

De volgende in­for­ma­tie over de klanten is opgenomen: hun naam, woon­plaats, land en het aantal producten dat ze hebben gekocht.

Als u ag­gre­ga­tie in MongoDB wilt uit­pro­be­ren, kunt u methode insertMany ( ) gebruiken om alle do­cu­men­ten met klant­ge­ge­vens toe te voegen aan de collectie met de naam ‘customers’:

db.customers.insertMany ( [
	{ "name" : "Smith", "city" : "Glasgow", "country" : "Scotland", "quantity" : 14 },
	{ "name" : "Meyer", "city" : "Hamburg", "country" : "Germany", "quantity" : 26 },
	{ "name" : "Lee", "city" : "Birmingham", "country" : "England", "quantity" : 5 },
	{ "name" : "Rodriguez", "city" : "Madrid", "country" : "Spain", "quantity" : 19 },
	{ "name" : "Nowak", "city" : "Krakow", "country" : "Poland", "quantity" : 13 },
{ "name" : "Rossi", "city" : "Milano", "country" : "Italy", "quantity" : 10 },
{ "name" : "Arslan", "city" : "Ankara", "country" : "Turkey", "quantity" : 18 },
{ "name" : "Martin", "city" : "Lyon", "country" : "France", "quantity" : 9 },
{ "name" : "Mancini", "city" : "Rome", "country" : "Italy", "quantity" : 21 },
{ "name" : "Schulz", "city" : "Munich", "country" : "Germany", "quantity" : 2 }
] )
shell

Er wordt een lijst met object-ID’s voor elk af­zon­der­lijk document weer­ge­ge­ven.

Hoe gebruik je $match?

Om de mo­ge­lijk­he­den van ag­gre­ga­tie in MongoDB te il­lu­stre­ren, passen we eerst de $match-fase toe op onze ‘customers’-collectie. Zonder aan­vul­len­de pa­ra­me­ters zou dit simpelweg de volledige lijst met klant­ge­ge­vens opleveren die hierboven is weer­ge­ge­ven.

In het volgende voorbeeld hebben we het echter ge­ïn­stru­eerd om ons alleen klanten uit Italië te tonen. Hier is het commando:

db.customers.aggregate ( [
	{ $match : { "country" : "Italy" } }
] )
shell

U krijgt nu alleen de object-ID’s en in­for­ma­tie van de twee klanten uit Italië te zien.

Gebruik $sort voor een beter overzicht

Als u uw klan­ten­da­ta­ba­se wilt ordenen, kunt u de $sort-fase gebruiken. In het volgende voorbeeld geven we het systeem de opdracht om alle klant­ge­ge­vens te sorteren op basis van het aantal gekochte eenheden, beginnend met het hoogste aantal. De invoer ziet er als volgt uit:

db.customers.aggregate ( [
	{ $sort : { "quantity" : -1 } }
] )
shell

Beperk de uitvoer met $project

Met de tot nu toe gebruikte fasen zul je zien dat de uitvoer relatief uit­ge­breid is. Naast de fei­te­lij­ke in­for­ma­tie in de do­cu­men­ten wordt bij­voor­beeld ook altijd de object-ID uit­ge­voerd. Je kunt $project in de MongoDB-ag­gre­ga­tie­pijp­lijn gebruiken om te bepalen welke in­for­ma­tie moet worden uit­ge­voerd. Hiervoor stellen we de waarde 1 in voor ver­plich­te velden en 0 voor velden die niet in de uitvoer hoeven te worden opgenomen. In ons voorbeeld willen we alleen de naam van de klant en het aantal gekochte producten zien. Hiervoor voeren we het volgende in:

db.customers.aggregate ( [
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
] )
shell

Combineer meerdere fasen met ag­gre­ga­tie in MongoDB

MongoDB-ag­gre­ga­tie biedt u ook de mo­ge­lijk­heid om meerdere fasen achter elkaar toe te passen. Deze worden dan achter elkaar uit­ge­voerd en aan het einde is er een uitvoer die rekening houdt met alle gewenste pa­ra­me­ters. Als u bij­voor­beeld alleen de namen en aankopen van Schotse klanten in aflopende volgorde wilt weergeven, kunt u de hierboven be­schre­ven fasen als volgt gebruiken:

db.customers.aggregate ( [
	{ $match : { "country" : "Scotland" } }
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
	{ $sort : { "quantity" : -1 } }
] )
shell
Ga naar hoofdmenu