Ag­gre­ge­ring i MongoDB är ett vär­de­fullt verktyg för att analysera och filtrera databaser. Pi­pe­li­ne­sy­ste­met gör det möjligt att spe­ci­fi­ce­ra frågor, vilket möjliggör högst anpassade resultat.

Vad är ag­gre­ge­ring i MongoDB?

MongoDB är en icke-re­la­tio­nell och do­ku­men­t­o­ri­en­te­rad databas som är utformad för an­vänd­ning med stora och va­ri­e­ran­de da­ta­mäng­der. Genom att avstå från rigida tabeller och använda tekniker som sharding (lagring av data på olika noder) kan NoSQL-lösningen skalas ho­ri­son­tellt samtidigt som den förblir mycket flexibel och mot­stånds­kraf­tig mot fel.

Dokument i det binära JSON-formatet BSON samlas i samlingar och kan sökas och redigeras med hjälp av MongoDB Query Language (MQL). Även om detta språk erbjuder många al­ter­na­tiv är det inte lämpligt (eller kanske inte till­räck­ligt lämpligt) för da­taa­na­lys. Därför erbjuder MongoDB ag­gre­ge­ring.

Inom data­ve­ten­skap avser detta begrepp olika processer. I MongoDB avser ag­gre­ge­ring analys och sam­man­fatt­ning av data med hjälp av olika ope­ra­tio­ner för att producera ett enda tydligt resultat. Under denna process ana­ly­se­ras och filtreras data från ett eller flera dokument enligt an­vän­dar­de­fi­ni­e­ra­de faktorer.

I följande avsnitt tittar vi inte bara på de möj­lig­he­ter som MongoDB-ag­gre­ge­ring erbjuder för om­fat­tan­de da­taa­na­lys, utan ger också exempel på hur du kan använda metoden aggregate ( ) med ett da­ta­bashan­te­rings­sy­stem.

Vad behöver jag för MongoDB-ag­gre­ge­ring?

Det finns endast några få krav för att använda ag­gre­ge­ring i MongoDB. Metoden exekveras i skalet och fungerar enligt logiska regler som du kan anpassa efter behoven i din analys.

För att kunna använda ag­gre­ge­ring i Mongo DB måste du ha MongoDB in­stal­le­rat på din dator. Om så inte är fallet kan du läsa om hur du laddar ner, in­stal­le­rar och kör databasen i vår om­fat­tan­de MongoDB-hand­led­ning.

Du bör också använda en kraftfull brandvägg och se till att din databas är kon­fi­gu­re­rad enligt alla gällande sä­ker­hets­stan­dar­der. För att kunna köra ag­gre­ge­ring i MongoDB måste du ha ad­mi­nist­ra­törs­rät­tig­he­ter.

Databasen fungerar på alla platt­for­mar, så stegen som beskrivs nedan gäller för alla ope­ra­tiv­sy­stem.

Vad är pipeline i MongoDB:s ag­gre­ge­rings­ram­verk?

I MongoDB kan du utföra enkla sökningar eller frågor, och databasen visar ome­del­bart re­sul­ta­ten. Denna metod är dock mycket begränsad, eftersom den endast kan visa resultat som redan finns i de lagrade do­ku­men­ten. Denna typ av fråga är inte avsedd för djup­gå­en­de analyser, åter­kom­man­de mönster eller för att härleda yt­ter­li­ga­re in­for­ma­tion.

Ibland måste olika källor inom en databas beaktas för att man ska kunna dra me­nings­ful­la slut­sat­ser. MongoDB-ag­gre­ge­ring används i sådana si­tu­a­tio­ner. För att uppnå sådana resultat använder metoden aggregate ( ) pipelines.

Rör­led­ning­ens roll

1

Medan indata består av många olika data, är utdata (dvs. slut­re­sul­ta­tet) entydigt. Vi kommer att förklara de olika stegen i MongoDB-ag­gre­ge­ring senare i detta avsnitt.

Syntax för MongoDB-ag­gre­ge­rings­pi­pe­li­ne

Först är det värt att ta en kort titt på syntaxen för ag­gre­ge­ring i MongoDB. Metoden är alltid struk­tu­re­rad enligt samma format och kan anpassas efter dina specifika krav. Den grund­läg­gan­de struk­tu­ren ser ut så här:

db.collection_name.aggregate ( pipeline, options )
shell

Här är collection_name namnet på den aktuella samlingen. Stegen i MongoDB-ag­gre­ge­ring­en listas under pipeline. options kan användas för yt­ter­li­ga­re valfria pa­ra­met­rar som de­fi­ni­e­rar utdata.

Pipeline-stadier

Det finns många steg i ag­gre­ge­rings­pi­pe­li­ne i MongoDB. De flesta av dem kan användas flera gånger inom en pipeline. Det skulle gå utanför ramen för denna artikel att lista alla al­ter­na­tiv här, särskilt eftersom vissa endast krävs för mycket specifika ope­ra­tio­ner. För att ge dig en upp­fatt­ning om stegen listar vi dock några av de mest använda här:

  • $count: Detta steg ger dig en in­di­ka­tion på hur många BSON-dokument som har beaktats för steget eller stegen i pipelinen.
  • $group: Detta steg sorterar och grupperar dokument enligt vissa pa­ra­met­rar.
  • $limit: Begränsar antalet dokument som skickas vidare till nästa steg i pipelinen.
  • $match: Med $match-steget begränsar du de dokument som används för följande steg.
  • $out: Detta steg används för att inkludera re­sul­ta­ten från MongoDB-ag­gre­ge­ring­en i samlingen. Detta steg kan endast användas i slutet av en pipeline.
  • $project: Använd $project för att välja specifika fält från en samling.
  • $skip: I detta steg ignoreras ett visst antal dokument. Du kan ange detta med ett al­ter­na­tiv.
  • $sort: Denna operation sorterar do­ku­men­ten i an­vän­da­rens samling. Do­ku­men­ten ändras dock inte utöver detta.
  • $unset: $unset ex­klu­de­rar vissa fält. Det gör motsatsen till vad $project gör.

Ett exempel på ag­gre­ge­ring i MongoDB

För att hjälpa dig att bättre förstå hur ag­gre­ge­ring i MongoDB fungerar visar vi några exempel på olika steg och hur du använder dem. För att använda MongoDB-ag­gre­ge­ring öppnar du skalet som ad­mi­nist­ra­tör. Normalt visas först en test­da­ta­bas. Om du vill använda en annan databas använder du kommandot use.

I det här exemplet kan vi tänka oss en databas som in­ne­hål­ler uppgifter om kunder som har köpt en viss produkt. För att göra det enkelt har databasen bara tio dokument, som alla har samma struktur:

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

Följande in­for­ma­tion om kunderna har in­klu­de­rats: deras namn, bo­stads­ort, land och antalet produkter de har köpt.

Om du vill prova ag­gre­ge­ring i MongoDB kan du använda metod insertMany ( ) för att lägga till alla dokument med kunddata till samlingen med namnet ”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

En lista med objekt-ID för varje enskilt dokument visas.

Hur man använder $match

För att il­lu­stre­ra möj­lig­he­ter­na med ag­gre­ge­ring i MongoDB kommer vi först att tillämpa $match-steget på vår samling “customers”. Utan yt­ter­li­ga­re pa­ra­met­rar skulle detta helt enkelt ge en komplett lista över kunddata som anges ovan.

I följande exempel har vi dock in­stru­e­rat den att endast visa kunder från Italien. Här är kommandot:

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

Nu visas endast objekt-ID:n och in­for­ma­tio­nen för de två kunderna från Italien.

Använd $sort för en bättre översikt

Om du vill or­ga­ni­se­ra din kund­da­ta­bas kan du använda steget $sort. I följande exempel in­stru­e­rar vi systemet att sortera alla kunddata efter antal köpta enheter, med början från det högsta antalet. In­mat­ning­en ser ut så här:

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

Begränsa utdata med $project

Med de steg som använts hittills ser du att utdata är relativt om­fat­tan­de. Till exempel visas alltid objekt-ID:t utöver den faktiska in­for­ma­tio­nen i do­ku­men­ten. Du kan använda $project i MongoDB-ag­gre­ge­rings­pi­pe­li­ne för att avgöra vilken in­for­ma­tion som ska visas. För att göra detta anger vi värdet 1 för ob­li­ga­to­ris­ka fält och 0 för fält som inte behöver in­klu­de­ras i utdata. I vårt exempel vill vi bara se kundens namn och antalet köpta produkter. För att göra detta anger vi följande:

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

Kombinera flera steg med ag­gre­ge­ring i MongoDB

MongoDB-ag­gre­ge­ring ger dig också möjlighet att tillämpa flera steg i följd. Dessa körs sedan efter varandra, och i slutet finns ett resultat som tar hänsyn till alla önskade pa­ra­met­rar. Om du till exempel bara vill visa namnen och inköpen för skotska kunder i fallande ordning kan du använda stegen som beskrivs ovan på följande sätt:

db.customers.aggregate ( [
	{ $match : { "country" : "Scotland" } }
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
	{ $sort : { "quantity" : -1 } }
] )
shell
Gå till huvudmeny