Sådan analyseres og filtreres databaser med MongoDB-aggregering
Aggregering i MongoDB er et værdifuldt værktøj til analyse og filtrering af databaser. Pipelinesystemet gør det muligt at specificere forespørgsler, hvilket giver mulighed for meget tilpassede resultater.
Hvad er aggregering i MongoDB?
MongoDB er en ikke-relationel og dokumentorienteret database, der er designet til brug med store og forskelligartede datamængder. Ved at undgå faste tabeller og bruge teknikker som sharding (lagring af data på forskellige noder) kan NoSQL-løsningen skaleres horisontalt, samtidig med at den forbliver meget fleksibel og modstandsdygtig over for fejl.
Dokumenter 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 muligheder, er det ikke egnet (eller måske ikke egnet nok) til dataanalyse. Derfor tilbyder MongoDB aggregering.
I datalogi refererer dette udtryk til forskellige processer. I MongoDB refererer aggregering til analyse og sammenfatning af data ved hjælp af forskellige operationer for at frembringe et enkelt og klart resultat. Under denne proces analyseres og filtreres data fra et eller flere dokumenter i henhold til brugerdefinerede faktorer.
I de følgende afsnit ser vi ikke kun på de muligheder, som MongoDB-aggregering tilbyder til omfattende dataanalyse, men giver også eksempler på, hvordan du kan bruge aggregate ( ) med et databasestyringssystem.
Hvad har jeg brug for til MongoDB-aggregering?
Der er kun få krav til brug af aggregering i MongoDB. Metoden udføres i shell og fungerer efter logiske regler, som du kan tilpasse til dine analysebehov.
For at kunne bruge aggregering i Mongo DB skal du have MongoDB installeret på din computer. Hvis det ikke er tilfældet, kan du finde ud af, hvordan du downloader, installerer og kører databasen i vores omfattende MongoDB-tutorial.
Du bør også bruge en kraftig firewall og sikre dig, at din database er konfigureret i overensstemmelse med alle gældende sikkerhedsstandarder. For at kunne køre aggregering i MongoDB skal du have administratorrettigheder.
Databasen fungerer på alle platforme, så nedenstående trin gælder for alle operativsystemer.
Hvad er pipelinen i MongoDB-aggregeringsrammen?
I MongoDB kan du udføre enkle søgninger eller forespørgsler, hvor databasen straks viser resultaterne. Denne metode er dog meget begrænset, da den kun kan vise resultater, der allerede findes i de gemte dokumenter. Denne type forespørgsel er ikke beregnet til dybdegående analyse, tilbagevendende mønstre eller til at udlede yderligere information.
Nogle gange er det nødvendigt at tage højde for forskellige kilder i en database for at kunne drage meningsfulde konklusioner. MongoDB-aggregering bruges i sådanne situationer. For at opnå sådanne resultater bruger metoden aggregate ( ) pipelines.
Rørledningens rolle
Aggregeringspipelines i MongoDB er processer, hvor eksisterende data analyseres og filtreres ved hjælp af forskellige trin for at vise det resultat, brugerne søger. Disse trin kaldes faser. Afhængigt af kravene kan en eller flere faser igangsættes. Disse udføres efter hinanden og ændrer din oprindelige indtastning, så outputtet (den information, du søger) kan vises i slutningen.
Mens input består af adskillige datastykker, er output (dvs. slutresultatet) entydigt. Vi vil senere i dette afsnit forklare de forskellige faser i MongoDB-aggregering.
Syntaks for MongoDB-aggregeringspipeline
Først er det værd at se kort på syntaksen for aggregering i MongoDB. Metoden er altid struktureret efter det samme format og kan tilpasses dine specifikke krav. Den grundlæggende struktur ser således ud:
db.collection_name.aggregate ( pipeline, options )shellHer er collection_name navnet på den pågældende samling. Trinene i MongoDB-aggregering er angivet under pipeline. options kan bruges til yderligere valgfri parametre, der definerer outputtet.
Pipeline-faser
Der er adskillige trin i aggregeringspipeline 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 mulighederne her, især da nogle kun er nødvendige for meget specifikke operationer. 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 indikation af, hvor mange BSON-dokumenter der er blevet taget i betragtning til fasen eller faserne i pipelinen.$group: Denne fase sorterer og samler dokumenter i henhold til bestemte parametre.$limit: Begrænser antallet af dokumenter, der sendes videre til næste fase i pipelinen.$match: Med $match-fasen begrænser du de dokumenter, der bruges til den følgende fase.$out: Denne fase bruges til at inkludere resultaterne af MongoDB-aggregeringen i samlingen. Denne fase kan kun bruges i slutningen af en pipeline.$project: Brug $project til at vælge bestemte felter fra en samling.$skip: Denne fase ignorerer et bestemt antal dokumenter. Du kan angive dette med en indstilling.$sort: Denne operation sorterer dokumenterne i brugerens samling. Dokumenterne ændres dog ikke ud over dette.$unset: $unset udelukker bestemte felter. Det gør det modsatte af, hvad $project gør.
Et eksempel på aggregering i MongoDB
For at hjælpe dig med bedre at forstå, hvordan aggregering i MongoDB fungerer, viser vi dig nogle eksempler på forskellige faser og hvordan du bruger dem. For at bruge MongoDB-aggregering skal du åbne shell som administrator. Normalt vises en testdatabase først. Hvis du vil bruge en anden database, skal du bruge kommandoen use.
I dette eksempel forestiller vi os en database, der indeholder data om kunder, der har købt et bestemt produkt. For at gøre det enkelt har denne database kun ti dokumenter, som alle er struktureret på samme måde:
{
"name" : "Smith",
"city" : "Glasgow",
"country" : "Scotland",
"quantity" : 14
}shellFølgende oplysninger om kunderne er medtaget: deres navn, bopæl, land og antallet af produkter, de har købt.
Hvis du vil prøve aggregering i MongoDB, kan du bruge metode insertMany ( ) til at tilføje alle dokumenter 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 }
] )shellDer vises en liste over objekt-id’er for hvert enkelt dokument.
Sådan bruges $match
For at illustrere mulighederne for aggregering i MongoDB vil vi først anvende $match-fasen på vores ‘customers’-samling. Uden yderligere parametre vil dette blot give den komplette liste over kundedata, der er angivet ovenfor.
I det følgende eksempel har vi dog instrueret den om kun at vise os kunder fra Italien. Her er kommandoen:
db.customers.aggregate ( [
{ $match : { "country" : "Italy" } }
] )shellDu får nu kun vist objekt-id’erne og oplysningerne om de to kunder fra Italien.
Brug $sort for at få et bedre overblik
Hvis du vil organisere din kundedatabase, kan du bruge $sort-fasen. I det følgende eksempel instruerer vi systemet om at sortere alle kundedata efter antallet af købte enheder, startende med det højeste antal. Indtastningen ser således ud:
db.customers.aggregate ( [
{ $sort : { "quantity" : -1 } }
] )shellBegræns output med $project
Med de trin, der er brugt indtil nu, vil du se, at outputtet er relativt omfattende. For eksempel vises objekt-ID’et altid ud over de faktiske oplysninger i dokumenterne. Du kan bruge $project i MongoDB-aggregeringspipeline til at bestemme, hvilke oplysninger der skal vises. For at gøre dette indstiller vi værdien 1 for obligatoriske 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 } }
] )shellKombiner flere trin med aggregering i MongoDB
MongoDB-aggregering 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ækkefølge, kan du bruge ovenstående 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