sql >> Database >  >> NoSQL >> MongoDB

MongoDB-aggregatievergelijking:group(), $group en MapReduce

Het is enigszins verwarrend omdat de namen op elkaar lijken, maar de group() commando is een andere functie en implementatie van de $group pijpleidingbeheerder in het aggregatieraamwerk.

De opdracht group(), Aggregation Framework en MapReduce zijn gezamenlijk aggregatiefuncties van MongoDB. Er is enige overlap in functies, maar ik zal proberen de verschillen en beperkingen van elk uit te leggen zoals bij MongoDB 2.2.0.

Opmerking:inline resultatensets hieronder vermeld verwijzen naar query's die in het geheugen worden verwerkt met resultaten die aan het einde van de functieaanroep worden geretourneerd. Alternatieve uitvoeropties (momenteel alleen beschikbaar met MapReduce) zijn onder meer het opslaan van resultaten in een nieuwe of bestaande verzameling.

group() Commando

  • Eenvoudige syntaxis en functionaliteit voor groeperen .. analoog aan GROUP BY in SQL.

  • Retourneert resultaatset inline (als een array van gegroepeerde items).

  • Geïmplementeerd met behulp van de JavaScript-engine; aangepaste reduce() functies kunnen in JavaScript worden geschreven.

  • Huidige beperkingen

    • Wordt niet gegroepeerd in een resultatenset met meer dan 20.000 sleutels.

    • Resultaten moeten passen binnen de beperkingen van een BSON-document (momenteel 16 MB).

    • Neemt een leesvergrendeling en staat geen andere threads toe om JavaScript uit te voeren terwijl het actief is.

    • Werkt niet met shard-verzamelingen.

  • Zie ook:voorbeelden group() commando's .

MapReduce

  • Implementeert het MapReduce-model voor het verwerken van grote datasets.

  • Kan kiezen uit een van de verschillende uitvoeropties (inline, nieuwe verzameling, samenvoegen, vervangen, verkleinen)

  • MapReduce-functies zijn geschreven in JavaScript.

  • Ondersteunt niet-shard- en shard-invoerverzamelingen.

  • Kan worden gebruikt voor incrementele aggregatie over grote collecties.

  • MongoDB 2.2 implementeert veel betere ondersteuning voor sharded map om de output te verminderen.

  • Huidige beperkingen

    • Een enkele emissie kan slechts de helft van MongoDB's maximale BSON-documentgrootte (16 MB) bevatten.

    • Er is een JavaScript-vergrendeling, dus een mongod-server kan slechts één JavaScript-functie tegelijk uitvoeren. De meeste stappen van MapReduce zijn echter erg kort, dus vergrendelingen kunnen vaak worden opgeleverd.

    • MapReduce-functies kunnen moeilijk te debuggen zijn. U kunt print() . gebruiken en printjson() om diagnostische uitvoer op te nemen in de mongod logboek.

    • MapReduce is over het algemeen niet intuïtief voor programmeurs die de relationele zoekaggregatie-ervaring proberen te vertalen.

  • Zie ook:Voorbeelden van kaarten/verkleinen .

Aggregatieraamwerk

  • Nieuwe functie in de productieversie van MongoDB 2.2.0 (augustus 2012).

  • Ontworpen met specifieke doelen om de prestaties en bruikbaarheid te verbeteren.

  • Retourneert resultaatset inline.

  • Ondersteunt niet-shard- en shard-invoerverzamelingen.

  • Gebruikt een "pijplijn"-benadering waarbij objecten worden getransformeerd terwijl ze door een reeks pijplijnoperators gaan, zoals matchen, projecteren, sorteren en groeperen.

  • Pipeline-operators hoeven niet één uitvoerdocument voor elk invoerdocument te produceren:operators kunnen ook nieuwe documenten genereren of documenten eruit filteren.

  • Met behulp van projecties kunt u berekende velden toevoegen, nieuwe virtuele subobjecten maken en subvelden extraheren naar het hoogste resultaatniveau.

  • Pijplijnoperators kunnen indien nodig worden herhaald (bijvoorbeeld meerdere $project of $group stappen.

  • Huidige beperkingen

    • Resultaten worden inline geretourneerd, dus zijn beperkt tot de maximale documentgrootte die door de server wordt ondersteund (16 MB)

    • Ondersteunt niet zoveel uitvoeropties als MapReduce

    • Beperkt tot operators en expressies die worden ondersteund door het Aggregation Framework (d.w.z. kan geen aangepaste functies schrijven)

    • Nieuwste serverfunctie voor aggregatie, dus heeft meer ruimte om te rijpen op het gebied van documentatie, functieset en gebruik.

  • Zie ook:Aggregation Framework-voorbeelden .

Kan iemand me een illustratie geven of me naar een link leiden waar deze drie concepten samen worden uitgelegd, waarbij dezelfde voorbeeldgegevens worden gebruikt, zodat ik ze gemakkelijk kan vergelijken?

Over het algemeen zult u geen voorbeelden vinden waarbij het handig zou zijn om alle drie de benaderingen te vergelijken, maar hier zijn eerdere StackOverflow-vragen die variaties laten zien:

  • group() versus aggregatieraamwerk
  • MapReduce versus aggregatieraamwerk



  1. Kunnen strikte JSON $dates worden gebruikt in een MongoDB-query?

  2. Hoe configureer je Embedded MongDB voor integratietesten in een Spring Boot-applicatie?

  3. MongoDB-zelfstudie voor 2022 - Leer wat MongoDB is?

  4. Schijfruimte op uw MongoDB-server begrijpen en beheren