Aggregationsoperationer bearbetar dataposter och returnerar beräknade resultat. Aggregeringsoperationer grupperar värden från flera dokument och kan utföra en mängd olika operationer på de grupperade uppgifterna för att returnera ett enda resultat. I SQL count(*) och med group by är en motsvarighet till MongoDB-aggregation.
Metoden aggregate()
För aggregering i MongoDB bör du använda metoden aggregate().
Syntax
Den grundläggande syntaxen för aggregate() metoden är följande –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Exempel
I samlingen har du följande data –
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 100},{ _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},
Nu från ovanstående samling, Om du vill visa en lista som anger hur många handledningar som skrivits av varje användare använder du följande aggregate()-metod –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
Sql-ekvivalent fråga för ovanstående användningsfall är select by_user, count(*) from mycol group by by_user.
I exemplet ovan har vi grupperat dokumenten efter fältet by_user och vid varje förekomst av by user ökas det tidigare värdet av summan. Nedan följer en lista över tillgängliga aggregeringsuttryck:
Uttryck | Beskrivning | Exempel |
---|---|---|
$sum | Summar upp det definierade värdet från alla dokument i samlingen. | db.mycol.aggregate() |
$avg | Beräknar medelvärdet av alla givna värden från alla dokument i samlingen. | db.mycol.aggregate() |
$min | Hämtar minimum av motsvarande värden från alla dokument i samlingen. | db.mycol.aggregate() |
$max | Hämtar det högsta av motsvarande värden från alla dokument i samlingen. | db.mycol.aggregate() |
$push | Insätter värdet i en array i det resulterande dokumentet. | db.mycol.aggregate() |
$addToSet | Insätter värdet i en matris i det resulterande dokumentet men skapar inga dubbletter. | db.mycol.aggregate() |
$first | Hämtar det första dokumentet från källdokumenten enligt grupperingen. Typiskt sett är detta endast meningsfullt tillsammans med något tidigare tillämpat ”$sort”-steg. | db.mycol.aggregate() |
$last | Hämtar det sista dokumentet från källdokumenten i enlighet med grupperingen. Typiskt sett är detta endast meningsfullt tillsammans med något tidigare tillämpat ”$sort”-steg. | db.mycol.aggregate() |
Pipeline-begreppet
I UNIX-kommandon innebär skalpipeline möjligheten att utföra en operation på en viss inmatning och använda utmatningen som inmatning för nästa kommando och så vidare. MongoDB har också stöd för samma koncept i aggregationsramverket. Det finns en uppsättning möjliga steg och vart och ett av dessa tas som en uppsättning dokument som ingång och producerar en resulterande uppsättning dokument (eller det slutliga resulterande JSON-dokumentet i slutet av pipelinen). Detta kan sedan i sin tur användas för nästa steg och så vidare.
Följande är de möjliga stegen i ramverket för aggregering –
-
$project – Används för att välja några specifika fält från en samling.
-
$match – Detta är en filtreringsoperation och kan därmed minska mängden dokument som ges som indata till nästa steg.
-
$group – Detta gör själva aggregeringen som diskuterats ovan.
-
$sort – Sorterar dokumenten.
-
$skip – Med detta är det möjligt att hoppa framåt i listan över dokument för ett givet antal dokument.
-
$limit – Detta begränsar antalet dokument att titta på, med det givna antalet med utgångspunkt från de aktuella positionerna.
-
$unwind – Detta används för att avveckla dokument som använder matriser. När man använder en array är data på ett sätt för-hopade och denna operation kommer att ångras med detta för att få individuella dokument igen. Med detta steg kommer vi alltså att öka antalet dokument för nästa steg.