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 enprintjson()
om diagnostische uitvoer op te nemen in demongod
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