sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB aggregeringssammenligning:group(), $group og MapReduce

Det er noget forvirrende, da navnene ligner hinanden, men group() kommandoen er en anden funktion og implementering end $group rørledningsoperatør i Aggregation Framework.

group()-kommandoen, Aggregation Framework og MapReduce er tilsammen aggregeringsfunktioner af MongoDB. Der er en vis overlapning i funktioner, men jeg vil forsøge at forklare forskellene og begrænsningerne for hver af dem som i MongoDB 2.2.0.

Bemærk:indlejrede resultatsæt nævnt nedenfor refererer til forespørgsler, der behandles i hukommelsen med resultater, der returneres i slutningen af ​​funktionskaldet. Alternative outputmuligheder (i øjeblikket kun tilgængelig med MapReduce) kunne omfatte lagring af resultater til en ny eller eksisterende samling.

group() Kommando

  • Simpel syntaks og funktionalitet til gruppering .. analogt med GROUP BY i SQL.

  • Returnerer resultatsæt inline (som en matrix af grupperede elementer).

  • Implementeret ved hjælp af JavaScript-motoren; tilpasset reduce() funktioner kan skrives i JavaScript.

  • Nuværende begrænsninger

    • Grupperes ikke i et resultatsæt med mere end 20.000 nøgler.

    • Resultaterne skal passe inden for begrænsningerne for et BSON-dokument (i øjeblikket 16 MB).

    • Tager en læselås og tillader ikke andre tråde at udføre JavaScript, mens det kører.

    • Virker ikke med opdelte samlinger.

  • Se også:group() kommandoeksempler .

MapReduce

  • Implementerer MapReduce-modellen til behandling af store datasæt.

  • Kan vælge mellem en af ​​flere outputmuligheder (inline, ny samling, flette, udskifte, reducere)

  • MapReduce-funktioner er skrevet i JavaScript.

  • Understøtter ikke-shardede og shardede inputsamlinger.

  • Kan bruges til trinvis aggregering over store samlinger.

  • MongoDB 2.2 implementerer meget bedre understøttelse af sharded map reducere output.

  • Nuværende begrænsninger

    • En enkelt udsendelse kan kun indeholde halvdelen af ​​MongoDBs maksimale BSON-dokumentstørrelse (16 MB).

    • Der er en JavaScript-lås, så en mongod-server kan kun udføre én JavaScript-funktion ad gangen .. dog er de fleste trin i MapReduce meget korte, så låse kan bruges ofte.

    • MapReduce-funktioner kan være svære at fejlfinde. Du kan bruge print() og printjson() at inkludere diagnostisk output i mongod log.

    • MapReduce er generelt ikke intuitivt for programmører, der forsøger at oversætte erfaring med relationel forespørgselsaggregering.

  • Se også:Kort/reducer eksempler .

Aggregation Framework

  • Ny funktion i MongoDB 2.2.0 produktionsudgivelsen (august 2012).

  • Designet med specifikke mål om at forbedre ydeevne og brugervenlighed.

  • Returnerer resultatsæt inline.

  • Understøtter ikke-shardede og shardede inputsamlinger.

  • Bruger en "pipeline"-tilgang, hvor objekter transformeres, når de passerer gennem en række pipeline-operatører, såsom matching, projektering, sortering og gruppering.

  • Pipeline-operatører behøver ikke producere ét outputdokument for hvert inputdokument:Operatører kan også generere nye dokumenter eller filtrere dokumenter fra.

  • Ved at bruge projektioner kan du tilføje beregnede felter, oprette nye virtuelle underobjekter og udtrække underfelter til resultaterne på øverste niveau.

  • Pipeline-operatorer kan gentages efter behov (for eksempel flere $project eller $group trin.

  • Nuværende begrænsninger

    • Resultater returneres inline, så de er begrænset til den maksimale dokumentstørrelse, der understøttes af serveren (16 MB)

    • Understøtter ikke så mange outputmuligheder som MapReduce

    • Begrænset til operatorer og udtryk, der understøttes af Aggregation Framework (dvs. kan ikke skrive brugerdefinerede funktioner)

    • Nyeste serverfunktion til aggregering, så der er mere plads til at modnes med hensyn til dokumentation, funktionssæt og brug.

  • Se også:Eksempler på sammenlægningsramme .

Kan nogen præsentere en illustration eller guide mig til et link, hvor disse tre begreber er forklaret sammen ved at tage de samme eksempeldata, så jeg nemt kan sammenligne dem?

Du vil generelt ikke finde eksempler, hvor det ville være nyttigt at sammenligne alle tre tilgange, men her er tidligere StackOverflow-spørgsmål, som viser variationer:

  • group() versus Aggregation Framework
  • MapReduce versus Aggregation Framework



  1. Få seneste MongoDB-rekord efter felt af dato og klokkeslæt

  2. Få en liste over indekser i MongoDB

  3. Redis Stack Exchange hvordan man sletter eller får nøgler efter mønster

  4. Hvordan flad et underdokument til rodniveau i MongoDB?