Ag­gre­ge­ring i MongoDB er et vær­di­fuldt værktøj til analyse og fil­tre­ring af databaser. Pipe­li­ne­sy­ste­met gør det muligt at spe­ci­fi­ce­re fo­re­spørgs­ler, hvilket giver mulighed for meget til­pas­se­de re­sul­ta­ter.

Hvad er ag­gre­ge­ring i MongoDB?

MongoDB er en ikke-re­la­tio­nel og do­ku­men­t­o­ri­en­te­ret database, der er designet til brug med store og for­skel­lig­ar­te­de da­ta­mæng­der. Ved at undgå faste tabeller og bruge teknikker som sharding (lagring af data på for­skel­li­ge noder) kan NoSQL-løsningen skaleres ho­ri­son­talt, samtidig med at den forbliver meget fleksibel og mod­stands­dyg­tig over for fejl.

Do­ku­men­ter i det binære JSON-format BSON er samlet i samlinger og kan søges og redigeres ved hjælp af MongoDB Query Language (MQL). Selvom dette sprog tilbyder mange mu­lig­he­der, er det ikke egnet (eller måske ikke egnet nok) til da­ta­a­na­ly­se. Derfor tilbyder MongoDB ag­gre­ge­ring.

I datalogi refererer dette udtryk til for­skel­li­ge processer. I MongoDB refererer ag­gre­ge­ring til analyse og sam­men­fat­ning af data ved hjælp af for­skel­li­ge ope­ra­tio­ner for at frem­brin­ge et enkelt og klart resultat. Under denne proces ana­ly­se­res og filtreres data fra et eller flere do­ku­men­ter i henhold til bru­ger­de­fi­ne­re­de faktorer.

I de følgende afsnit ser vi ikke kun på de mu­lig­he­der, som MongoDB-ag­gre­ge­ring tilbyder til om­fat­ten­de da­ta­a­na­ly­se, men giver også eksempler på, hvordan du kan bruge aggregate ( ) med et da­ta­ba­sesty­rings­sy­stem.

Hvad har jeg brug for til MongoDB-ag­gre­ge­ring?

Der er kun få krav til brug af ag­gre­ge­ring i MongoDB. Metoden udføres i shell og fungerer efter logiske regler, som du kan tilpasse til dine ana­ly­se­be­hov.

For at kunne bruge ag­gre­ge­ring i Mongo DB skal du have MongoDB in­stal­le­ret på din computer. Hvis det ikke er tilfældet, kan du finde ud af, hvordan du down­lo­a­der, in­stal­le­rer og kører databasen i vores om­fat­ten­de MongoDB-tutorial.

Du bør også bruge en kraftig firewall og sikre dig, at din database er kon­fi­gu­re­ret i over­ens­stem­mel­se med alle gældende sik­ker­heds­stan­dar­der. For at kunne køre ag­gre­ge­ring i MongoDB skal du have ad­mi­ni­stra­tor­ret­tig­he­der.

Databasen fungerer på alle platforme, så ne­den­stå­en­de trin gælder for alle ope­ra­tiv­sy­ste­mer.

Hvad er pipelinen i MongoDB-ag­gre­ge­rings­ram­men?

I MongoDB kan du udføre enkle søgninger eller fo­re­spørgs­ler, hvor databasen straks viser re­sul­ta­ter­ne. Denne metode er dog meget begrænset, da den kun kan vise re­sul­ta­ter, der allerede findes i de gemte do­ku­men­ter. Denne type fo­re­spørgsel er ikke beregnet til dyb­de­gå­en­de analyse, til­ba­ge­ven­den­de mønstre eller til at udlede yder­li­ge­re in­for­ma­tion.

Nogle gange er det nød­ven­digt at tage højde for for­skel­li­ge kilder i en database for at kunne drage me­nings­ful­de kon­klu­sio­ner. MongoDB-ag­gre­ge­ring bruges i sådanne si­tu­a­tio­ner. For at opnå sådanne re­sul­ta­ter bruger metoden aggregate ( ) pipelines.

Rør­led­nin­gens rolle

Ag­gre­ge­ring­spipe­li­nes i MongoDB er processer, hvor ek­si­ste­ren­de data ana­ly­se­res og filtreres ved hjælp af for­skel­li­ge trin for at vise det resultat, brugerne søger. Disse trin kaldes faser. Afhængigt af kravene kan en eller flere faser igang­sæt­tes. Disse udføres efter hinanden og ændrer din op­rin­de­li­ge ind­tast­ning, så outputtet (den in­for­ma­tion, du søger) kan vises i slut­nin­gen.

Mens input består af ad­skil­li­ge da­ta­styk­ker, er output (dvs. slut­re­sul­ta­tet) entydigt. Vi vil senere i dette afsnit forklare de for­skel­li­ge faser i MongoDB-ag­gre­ge­ring.

Syntaks for MongoDB-ag­gre­ge­ring­spipe­li­ne

Først er det værd at se kort på syntaksen for ag­gre­ge­ring i MongoDB. Metoden er altid struk­tu­re­ret efter det samme format og kan tilpasses dine spe­ci­fik­ke krav. Den grund­læg­gen­de struktur ser således ud:

db.collection_name.aggregate ( pipeline, options )
shell

Her er collection_name navnet på den på­gæl­den­de samling. Trinene i MongoDB-ag­gre­ge­ring er angivet under pipeline. options kan bruges til yder­li­ge­re valgfri parametre, der definerer outputtet.

Pipeline-faser

Der er ad­skil­li­ge trin i ag­gre­ge­ring­spipe­li­ne i MongoDB. De fleste af dem kan bruges flere gange i en pipeline. Det ville gå ud over denne artikels omfang at nævne alle mu­lig­he­der­ne her, især da nogle kun er nød­ven­di­ge for meget spe­ci­fik­ke ope­ra­tio­ner. For at give dig en idé om trinene vil vi dog nævne nogle af de mest anvendte her:

  • $count: Denne fase giver dig en in­di­ka­tion af, hvor mange BSON-do­ku­men­ter der er blevet taget i be­tragt­ning til fasen eller faserne i pipelinen.
  • $group: Denne fase sorterer og samler do­ku­men­ter i henhold til bestemte parametre.
  • $limit: Begrænser antallet af do­ku­men­ter, der sendes videre til næste fase i pipelinen.
  • $match: Med $match-fasen begrænser du de do­ku­men­ter, der bruges til den følgende fase.
  • $out: Denne fase bruges til at inkludere re­sul­ta­ter­ne af MongoDB-ag­gre­ge­rin­gen i samlingen. Denne fase kan kun bruges i slut­nin­gen af en pipeline.
  • $project: Brug $project til at vælge bestemte felter fra en samling.
  • $skip: Denne fase ignorerer et bestemt antal do­ku­men­ter. Du kan angive dette med en indstil­ling.
  • $sort: Denne operation sorterer do­ku­men­ter­ne i brugerens samling. Do­ku­men­ter­ne ændres dog ikke ud over dette.
  • $unset: $unset udelukker bestemte felter. Det gør det modsatte af, hvad $project gør.

Et eksempel på ag­gre­ge­ring i MongoDB

For at hjælpe dig med bedre at forstå, hvordan ag­gre­ge­ring i MongoDB fungerer, viser vi dig nogle eksempler på for­skel­li­ge faser og hvordan du bruger dem. For at bruge MongoDB-ag­gre­ge­ring skal du åbne shell som ad­mi­ni­stra­tor. Normalt vises en test­da­ta­ba­se først. Hvis du vil bruge en anden database, skal du bruge kom­man­do­en use.

I dette eksempel fo­re­stil­ler vi os en database, der in­de­hol­der data om kunder, der har købt et bestemt produkt. For at gøre det enkelt har denne database kun ti do­ku­men­ter, som alle er struk­tu­re­ret på samme måde:

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

Følgende op­lys­nin­ger om kunderne er medtaget: deres navn, bopæl, land og antallet af produkter, de har købt.

Hvis du vil prøve ag­gre­ge­ring i MongoDB, kan du bruge metode insertMany ( ) til at tilføje alle do­ku­men­ter med kundedata til samlingen med navnet ‘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

Der vises en liste over objekt-id’er for hvert enkelt dokument.

Sådan bruges $match

For at il­lu­stre­re mu­lig­he­der­ne for ag­gre­ge­ring i MongoDB vil vi først anvende $match-fasen på vores ‘customers’-samling. Uden yder­li­ge­re parametre vil dette blot give den komplette liste over kundedata, der er angivet ovenfor.

I det følgende eksempel har vi dog in­stru­e­ret den om kun at vise os kunder fra Italien. Her er kom­man­do­en:

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

Du får nu kun vist objekt-id’erne og op­lys­nin­ger­ne om de to kunder fra Italien.

Brug $sort for at få et bedre overblik

Hvis du vil or­ga­ni­se­re din kun­de­da­ta­ba­se, kan du bruge $sort-fasen. I det følgende eksempel in­stru­e­rer vi systemet om at sortere alle kundedata efter antallet af købte enheder, startende med det højeste antal. Ind­tast­nin­gen ser således ud:

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

Begræns output med $project

Med de trin, der er brugt indtil nu, vil du se, at outputtet er relativt om­fat­ten­de. For eksempel vises objekt-ID’et altid ud over de faktiske op­lys­nin­ger i do­ku­men­ter­ne. Du kan bruge $project i MongoDB-ag­gre­ge­ring­spipe­li­ne til at bestemme, hvilke op­lys­nin­ger der skal vises. For at gøre dette indstil­ler vi værdien 1 for ob­liga­to­ri­ske felter og 0 for felter, der ikke skal medtages i outputtet. I vores eksempel ønsker vi kun at se kundens navn og antallet af købte produkter. For at gøre dette indtaster vi følgende:

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

Kombiner flere trin med ag­gre­ge­ring i MongoDB

MongoDB-ag­gre­ge­ring giver dig også mulighed for at anvende flere trin efter hinanden. Disse køres derefter efter hinanden, og til sidst får du et resultat, der tager højde for alle de ønskede parametre. Hvis du f.eks. kun vil vise navne og køb fra skotske kunder i faldende ræk­ke­føl­ge, kan du bruge oven­stå­en­de trin som følger:

db.customers.aggregate ( [
	{ $match : { "country" : "Scotland" } }
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
	{ $sort : { "quantity" : -1 } }
] )
shell
Gå til ho­ved­me­nu­en