sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB-aggregationsjämförelse:group(), $group och MapReduce

Det är något förvirrande eftersom namnen är liknande, men group() kommandot är en annan funktion och implementering än $group pipeline-operatör i Aggregation Framework.

Kommandot group(), Aggregation Framework och MapReduce är tillsammans aggregationsfunktioner av MongoDB. Det finns viss överlappning i funktioner, men jag ska försöka förklara skillnaderna och begränsningarna för var och en som i MongoDB 2.2.0.

Obs:inline resultatuppsättningar som nämns nedan hänvisar till frågor som bearbetas i minnet med resultat som returneras i slutet av funktionsanropet. Alternativa utdataalternativ (för närvarande endast tillgängliga med MapReduce) kan inkludera att spara resultat till en ny eller befintlig samling.

group() Kommando

  • Enkel syntax och funktionalitet för gruppering .. analogt med GROUP BY i SQL.

  • Returnerar resultatuppsättning inline (som en uppsättning grupperade objekt).

  • Implementerat med hjälp av JavaScript-motorn; anpassad reduce() funktioner kan skrivas i JavaScript.

  • Nuvarande begränsningar

    • Grupperas inte i en resultatuppsättning med fler än 20 000 nycklar.

    • Resultaten måste passa inom begränsningarna för ett BSON-dokument (för närvarande 16 MB).

    • Tar ett läslås och tillåter inte några andra trådar att köra JavaScript medan det körs.

    • Fungerar inte med fragmenterade samlingar.

  • Se även:exempel på kommandon group() .

MapReduce

  • Implementerar MapReduce-modellen för bearbetning av stora datamängder.

  • Kan välja mellan ett av flera utdataalternativ (inline, ny samling, sammanfoga, ersätta, reducera)

  • MapReduce-funktioner är skrivna i JavaScript.

  • Stöder icke-delade och delade indatasamlingar.

  • Kan användas för inkrementell aggregering över stora samlingar.

  • MongoDB 2.2 implementerar mycket bättre stöd för sharded map reducerar utdata.

  • Nuvarande begränsningar

    • En enda emit kan bara hålla hälften av MongoDB:s maximala BSON-dokumentstorlek (16 MB).

    • Det finns ett JavaScript-lås så en mongod-server kan bara köra en JavaScript-funktion åt gången .. de flesta stegen i MapReduce är dock väldigt korta så lås kan användas ofta.

    • MapReduce-funktioner kan vara svåra att felsöka. Du kan använda print() och printjson() för att inkludera diagnostisk utdata i mongod log.

    • MapReduce är i allmänhet inte intuitivt för programmerare som försöker översätta upplevelsen av relationell frågeaggregation.

  • Se även:Karta/minska exempel .

Aggregationsram

  • Ny funktion i MongoDB 2.2.0 produktionsversionen (augusti 2012).

  • Designad med specifika mål att förbättra prestanda och användbarhet.

  • Returnerar resultatuppsättning inline.

  • Stöder icke-delade och delade indatasamlingar.

  • Använder en "pipeline"-metod där objekt transformeras när de passerar genom en serie pipeline-operatorer som matchning, projicering, sortering och gruppering.

  • Pipeline-operatörer behöver inte producera ett utdatadokument för varje indatadokument:operatörer kan också generera nya dokument eller filtrera bort dokument.

  • Med hjälp av projektioner kan du lägga till beräknade fält, skapa nya virtuella underobjekt och extrahera underfält till den översta nivån av resultat.

  • Pipeline-operatorer kan upprepas efter behov (till exempel flera $project eller $group steg.

  • Nuvarande begränsningar

    • Resultaten returneras inline, så de är begränsade till den maximala dokumentstorleken som stöds av servern (16 MB)

    • Stöder inte lika många utdataalternativ som MapReduce

    • Begränsad till operatorer och uttryck som stöds av Aggregation Framework (dvs. kan inte skriva anpassade funktioner)

    • Den senaste serverfunktionen för aggregering, så har mer utrymme att mogna när det gäller dokumentation, funktionsuppsättning och användning.

  • Se även:Exempel på aggregationsram .

Kan någon presentera en illustration eller guida mig till en länk där dessa tre begrepp förklaras tillsammans, med samma exempeldata, så att jag enkelt kan jämföra dem?

Du kommer vanligtvis inte att hitta exempel där det skulle vara användbart att jämföra alla tre metoderna, men här är tidigare StackOverflow-frågor som visar variationer:

  • group() kontra Aggregation Framework
  • MapReduce kontra aggregation Framework



  1. Node.js + mongoose hitta fryser nod när mer än 100 resultat

  2. Spåra MongoDB prestanda?

  3. Skrivskyddat filsystem när du försöker mkdir /data/db på Mac

  4. MongoNetworkError:kunde inte ansluta till servern [localhost:27017] vid första anslutningen [MongoNetworkError:connect ECONNREFUSED 127.0.0.1:27017]