Als MapReduce uw favoriete keuze is geweest, zou dit het moment kunnen zijn om over te stappen naar MongoDB's Aggregation Pipeline voor het aanpakken van complexe operaties.
De aggregatiepijplijn is de aanbevolen manier om complexe query's uit te voeren in MongoDB. Als u MapReduce van MongoDB hebt gebruikt, kunt u beter overschakelen naar de aggregatiepijplijn voor efficiëntere berekeningen.
Wat is aggregatie in MongoDB en hoe werkt het?
De aggregatiepijplijn is een meerfasig proces voor geavanceerde uitvoering zoekopdrachten in MongoDB. Het verwerkt gegevens via verschillende fasen, een zogenaamde pijplijn. U kunt de resultaten die op het ene niveau zijn gegenereerd, als bewerkingssjabloon op een ander niveau gebruiken.
U kunt bijvoorbeeld het resultaat van een matchbewerking doorgeven aan een andere fase om deze in die volgorde te sorteren totdat u de gewenste uitvoer krijgt.
Elke fase van een aggregatiepijplijn bevat een MongoDB-operator en genereert een of meer getransformeerde documenten. Afhankelijk van uw zoekopdracht kan een niveau meerdere keren in de pijplijn voorkomen. Mogelijk moet u bijvoorbeeld de
$ tellen of $sorteren operator stapt meer dan één keer door de aggregatiepijplijn.De fasen van de aggregatiepijplijn
De aggregatiepijplijn leidt gegevens door meerdere fasen in één query. Er zijn verschillende fasen en u kunt de details ervan vinden in de MongoDB-documentatie.
Laten we hieronder enkele van de meest gebruikte definiëren.
De $match-fase
Deze fase helpt u bij het definiëren van specifieke filtervoorwaarden voordat u met de andere aggregatiefasen begint. U kunt het gebruiken om de overeenkomende gegevens te selecteren die u in de aggregatiepijplijn wilt opnemen.
De $groepsfase
De groepsfase verdeelt gegevens in verschillende groepen op basis van specifieke criteria met behulp van sleutel-waardeparen. Elke groep vertegenwoordigt een sleutel in het uitvoerdocument.
Denk bijvoorbeeld eens aan het volgende verkoop voorbeeldgegevens:
Met behulp van de aggregatiepijplijn kunt u het totale aantal verkopen en de topverkopen voor elke productsectie berekenen:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
De _id: $Sectie pair groepeert het uitvoerdocument op basis van de secties. Door het opgeven van de top_sales_count En top_verkoop velden creëert MongoDB nieuwe sleutels op basis van de bewerking die is gedefinieerd door de aggregator; dit kan zijn $som, $min, $max, of $gem.
De $skip-fase
U kunt gebruik maken van de $overslaan fase om een bepaald aantal documenten in de uitvoer weg te laten. Meestal komt het na de groepsfase. Als u bijvoorbeeld twee uitvoerdocumenten verwacht, maar er één overslaat, wordt bij de aggregatie alleen het tweede document uitgevoerd.
Om een stap voor overslaan toe te voegen, voegt u de $overslaan bewerking in de aggregatiepijplijn:
...,
{
$skip: 1
},
De $sort-fase
Met de sorteerfase kunt u gegevens in aflopende of oplopende volgorde ordenen. We kunnen de gegevens in het vorige queryvoorbeeld bijvoorbeeld verder in aflopende volgorde sorteren om te bepalen welke sectie de hoogste omzet heeft.
Voeg de $sorteren operator naar de vorige vraag:
...,
{
$sort: {top_sales: -1}
},
De $limit-fase
De limietbewerking helpt het aantal uitvoerdocumenten te verminderen dat u in de aggregatiepijplijn wilt weergeven. Gebruik bijvoorbeeld de $limiet operator om de sectie te krijgen met de hoogste omzet in de vorige fase:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Het bovenstaande retourneert alleen het eerste document; dit is de sectie met de hoogste omzet, zoals deze bovenaan de gesorteerde uitvoer verschijnt.
De $project-fase
De $project Met Stage kunt u het uitvoerdocument naar eigen wens vormgeven. De... gebruiken $project operator, kunt u opgeven welk veld u in de uitvoer wilt opnemen en de sleutelnaam ervan aanpassen.
Een voorbeelduitvoer zonder de $project fase ziet er zo uit:
Laten we eens kijken hoe het eruit ziet met de $project fase. Om de toe te voegen $project naar de pijpleiding:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Omdat we de gegevens eerder hebben gegroepeerd op basis van productsecties, omvat het bovenstaande elke productsectie in het uitvoerdocument. Het zorgt er ook voor dat het geaggregeerde aantal verkopen en de hoogste verkopen in de uitvoer voorkomen TotaalVerkocht En Topverkoop.
De uiteindelijke uitvoer is een stuk schoner vergeleken met de vorige:
De $unwind-fase
De $ontspan fase splitst een array binnen een document op in afzonderlijke documenten. Neem het volgende Bestellingen gegevens, bijvoorbeeld:
Gebruik de $ontspan podium om de te deconstrueren artikelen array voordat u andere aggregatiefasen toepast. Bijvoorbeeld het afwikkelen van de artikelen array is zinvol als u de totale opbrengst voor elk product wilt berekenen:
db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",
}
}
])
Hier is het resultaat van de bovenstaande aggregatiequery:
Hoe u een aggregatiepijplijn maakt in MongoDB
Hoewel de aggregatiepijplijn verschillende bewerkingen omvat, geven de eerder genoemde fasen u een idee van hoe u deze in de pijplijn kunt toepassen, inclusief de basisquery voor elke bewerking.
Met behulp van de vorige verkoop gegevensvoorbeeld, laten we enkele van de hierboven besproken fasen in één stuk bekijken voor een breder beeld van de aggregatiepijplijn:
db.sales.aggregate([
{
"$match": {
"Sold": { "$gte": 5 }
}
},{
"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },
}},
{
"$sort": { "top_sales": -1 }
},{"$skip": 0},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
])
De uiteindelijke uitvoer ziet eruit als iets dat je eerder hebt gezien:
Aggregatiepijplijn vs. KaartVerminderen
Tot de beëindiging ervan vanaf MongoDB 5.0 was de conventionele manier om gegevens in MongoDB te verzamelen via MapReduce. Hoewel MapReduce heeft bredere toepassingen buiten MongoDB is het minder efficiënt dan de aggregatiepijplijn, waardoor scripting van derden nodig is om de kaart te schrijven en de functies afzonderlijk te verminderen.
De aggregatiepijplijn is daarentegen alleen specifiek voor MongoDB. Maar het biedt een schonere en efficiëntere manier om complexe zoekopdrachten uit te voeren. Naast eenvoud en schaalbaarheid van query's, maken de aanbevolen pijplijnfasen de uitvoer beter aanpasbaar.
Er zijn veel meer verschillen tussen de aggregatiepijplijn en MapReduce. U ziet ze wanneer u overschakelt van MapReduce naar de aggregatiepijplijn.
Maak big data-query's efficiënt in MongoDB
Uw zoekopdracht moet zo efficiënt mogelijk zijn als u diepgaande berekeningen wilt uitvoeren op complexe gegevens in MongoDB. De aggregatiepijplijn is ideaal voor geavanceerde query's. In plaats van gegevens in afzonderlijke bewerkingen te manipuleren, wat vaak de prestaties vermindert, kunt u met aggregatie ze allemaal in één performante pijplijn verpakken en ze één keer uitvoeren.
Hoewel de aggregatiepijplijn efficiënter is dan MapReduce, kunt u de aggregatie sneller en efficiënter maken door uw gegevens te indexeren. Dit beperkt de hoeveelheid gegevens die MongoDB tijdens elke aggregatiefase moet scannen.