Inleiding
In dit artikel zal ik u kennismaken met de Mongodb groep door meerdere velden. Om beter te begrijpen eerst zullen we leren over de aggregatie functie.
MongoDB Aggregation Functie
Agggregatie functies worden gebruikt in GROUP BY clausules om gegroepeerde gegevens te aggregeren. Aggregatiefuncties presteren beter wanneer ze worden gebruikt met de GROUP BY-clausule. Het gebruik van aggregatiefuncties is echter niet beperkt tot gegroepeerde query’s.
Wanneer een aggregatiefunctie wordt gebruikt in een query zonder de GROUP BY-clausule, aggregeert de aggregatiefunctie de volledige resultaatverzameling (alle rijen die aan de WHERE-clausule voldoen). Als u de GROUP BY-clausule niet gebruikt, kunnen sommige aggregaatfuncties in de SELECT-lijst alleen worden gebruikt met andere aggregaatfuncties. Daarom moet de aggregaatfunctie de GROUP BY-clausule gebruiken om verbinding te maken met de lijst in de SELECT-lijst.
In plaats van de GROUP BY-clausule te gebruiken, kan AVG in een SELECT-lijst bijvoorbeeld alleen overeenkomen met SUM, maar het kan niet overeenkomen met een specifieke kolom.
De MongoDB-aggregatiebewerking wordt gebruikt voor batchbewerkingen op de gegevens. Nadat de verzameling is gegroepeerd op voorwaarde, een reeks van operaties zoals som, gemiddelde, en anderen worden uitgevoerd. Aggregatie operaties kunnen uitvoeren complexe verzamelingen operaties, met name voor wiskunde statistieken en data mining.
De input van de aggregatie bewerking in MongoDB is de collectie document. De output kan een of meer documenten zijn. MongoDB biedt een zeer krachtige aggregatie operatie die kan worden onderverdeeld in drie categorieën:
- Aggregation pipeline
- Agggregatie operatie voor eenmalig gebruik
- MapReduce programmeermodel
Mongodb Group by Multiple Fields
De $ groep operator is een aggregator die een nieuw document retourneert. Het heeft zijn eigen operator, kunnen we het veld van het huidige document te krijgen door $ symbool + veldnaam. Om de MongoDB groep te begrijpen door meerdere velden eerst, laten we eens kijken naar een lijst van alle operatoren die kunnen worden gebruikt in $ groep:
- $ sum – Geeft de som van alle numerieke velden.
- $ avg – Berekent het gemiddelde tussen numerieke velden.
- $ min – Geeft de minimale waarde van het numerieke veld
- $ max – Krijgt de maximale waarde van het numerieke veld.
- $ push – Voegt de veldwaarde in het resultaatveld in
- $ addToSet – Voegt een waarde in een array van het resulterende document in, maar maakt geen duplicaten.
- $ first – Haalt alleen het eerste document uit de gegroepeerde, meestal om te sorteren.
- $ last – Geeft het laatste document terug.
Samenvoegingspijplijn
In multi-threaded POSIX-modus is er een methode die een pijplijn wordt genoemd, waarvan de stroom gegevenselementen sequentieel wordt uitgevoerd door een reeks threads in de opgegeven volgorde.De samenvoegingspijplijn bestaat uit een stadium. Na verwerking van het document in een stadium, draagt de aggregatiepijplijn het verwerkingsresultaat over aan het volgende stadium.
Polymer tube functie Filter het document om te achterhalen welke documenten aan de criteria voldoen. Converteer het document en verander de uitvoervorm van het document.
Elk niveau van de aggregatiepijplijn wordt gedefinieerd met behulp van faseoperatoren, en elke faseoperator kan expressieoperatoren gebruiken om de som, het gemiddelde, de aaneenschakeling of regeleindes voor elk niveau te berekenen. Het resultaat wordt geretourneerd aan het einde en het geretourneerde resultaat kan direct worden uitgevoerd of opgeslagen in de verzameling.
Verwerkingsstroom
- Db.collection.aggregate () kan meerdere kanalen tegelijk gebruiken voor gegevensverwerking.
- Db.collection.aggregate () gebruikt MongoDB’s native operaties om efficiënt te aggregeren en bewerkingen zoals GroupBy in SQL te ondersteunen zonder aangepaste JS-routines te hoeven schrijven.
- Elke fase van de pijplijn beperkt 100 MB geheugen. Als een single-node pijplijn overschrijdt de limiet, MongoDB genereert een fout. Om grote hoeveelheden gegevens te verwerken, stelt u de eigenschap allowDiskUse in op true om gegevens naar een tijdelijk bestand te schrijven voor een geaggregeerde pijplijnnode en een geheugenlimiet van 100 MB toe te staan.
- Db.collection.aggregate () kan worden toegepast op een reeks slices, maar het resultaat kan niet verloren gaan in de reeks slices. MapReduce kan worden toegepast op een reeks van slices, en het resultaat kan verloren gaan in een reeks van slices.
- Db.collection.aggregate () retourneert een cursor, de gegevens worden opgeslagen in het geheugen en kan direct worden beheerd als MongoShell.
- De uitvoer van db.collection.aggregate () kan alleen worden opgeslagen in één document, en de BSON documentgrootte is beperkt tot 16 MB.
Grouping methode
Het gebruik van de groep methode is vergelijkbaar met het gebruik van de GROUP BY-clausule in SQL. De methode group heeft drie parameters:
- Key: Geeft de sleutel van de groep weer
- Initial: Initialiseert het documentveld dat de documentgroep vertegenwoordigt
- Reduce: Een functie die het aantal elementen teruggeeft. Deze functie gebruikt twee parameters als argumenten: het huidige element en het geaggregeerde resultatendocument voor de huidige groep.
- Keyf: optionele parameter. Gebruik een andere functie dan het sleutelargument om het retoursleutelobject weer te geven.
- Cond: optionele parameter. Specificeert dat de voorwaarde waar moet terugkomen, anders zal het document niet deelnemen aan de groepering. Als deze parameter niet is gespecificeerd, nemen alle documenten deel aan de groepering.
- Finalize: optionele parameter. Dit vertegenwoordigt een functie die wordt geactiveerd voordat een gegroepeerd resultaat wordt geretourneerd.
Voorbeeld:`
js> db.users.group ({key: {naam : true}, initial: {totaal : 0},reduce : functie (curr, res){res.totaal += 1}})`
Laten we eens naar de expressie kijken. De parameter key geeft aan dat de groep wordt gegroepeerd op naam: key: {naam: true}
De waarde van de parameter initial initialiseert de velden die het resultatendocument voor de groep weergeven. In dit geval wordt de beginwaarde van het veld totaal ingesteld. Dit veld geeft het aantal elementen in de groep aan. Aangezien er misschien geen elementen zijn, initialiseren we op nul.
De parameter reduce vertegenwoordigt een functie waarbij de parameter curr naar het huidige object in de groep wijst en res de huidige groep vertegenwoordigt. Als u een ander object vindt met een specifieke waarde voor het naamveld, voegt u dat document toe aan de groep en verhoogt u de totale waarde in het res-document met 1.
Het gebruik van $group
De $group gebruikt _id om de sleutelnaam op te geven die moet worden gegroepeerd, met behulp van de aangepaste veldstatistieken. Met behulp van aggregaat operatie zal het concept van Mongodb groep door meerdere velden te wissen.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
db.users.aggregate({
$match : { age: { $gte : 18 } } },{ $groep : { _id:$gebruikersnaam, count:{$sum:1} } } } }); / Mongodb groeperen op meerdere velden db.users.aggregate({ $match: {$leeftijd: {$gte:18} }}, $groep: {_id:{gebruikersnaam:$gebruikersnaam, leeftijd:$ge}, ‘count’:{$sum:1} } }) / $sum:val Voeg val toe aan elk document / $avg:val Gemiddelde de waarde van elk document db.users.aggregate({ $groep: { _id:$gebruikersnaam, count:{$avg:$leeftijd} } }) db.users.aggregate({ $groep: { _id:$gebruikersnaam, count:{$max:$leeftijd} } }) db.users.aggregate({ $groep: { _id:$gebruikersnaam, count:{$max:$leeftijd} } }users.aggregate({ $group: {_id:$username, count:{$min:$age} } }) // $first:val Wordt eerste in de groep db.users.aggregate({ $group:{_id:$username, count:{$first: $age} } }) db.users.aggregate({ $group:{_id:$username, count:{$last: $age} } }) db.users.aggregate({ $group:{_id:$username, count:{$addToSet: $age} } }) db.users.aggregate({ $group:{_id:$username, count:{$push: $age} } }) |
Mongodb groepeert op meerdere velden met de bewerking Aggregate
Eerst wordt de sleutel geselecteerd waarop de groepering is gebaseerd en vervolgens wordt de verzameling in groepen verdeeld op basis van de geselecteerde sleutelwaarde. Vervolgens kunt u een einddocument maken door de documenten in elke groep samen te voegen.
De groep biedt geen ondersteuning voor gefragmenteerde clusters en kan geen shard-clustering uitvoeren. Als u gedistribueerde ondersteuning nodig hebt, moet u aggregate of mapReduce gebruiken.
1
2 3 4 5 6 7 8 9 10 11 12 13 |
db.collection.group(document)
{ # Groeperingsveld key:{key1, key2:1}, # Query-voorwaarden cond:{}, # Aggregatiefunctie reduce:functie(current, resultaat){}, #initialisatie initial:{}, # Tellerretourfunctie instellen finalize:functie(){} } |
Bereken het aantal items in elke kolom
1
2 3 4 5 6 7 8 9 |
SELECT COUNT(*) FROM goods GROUP BY category_id;
db.goods.group({ key:{category_id:1}, cond:{},// allemaal samen reduce:function(current, result){// Overeenkomend met de huidige regel,result Overeenkomend met meerdere rijen in de groep result.total += 1; }, initial:{total:0} }) |
Conclusie
Dit artikel is geschreven voor de ontwikkelaars om de Mongodb groep te begrijpen door meerdere velden met behulp van aggregaat functie. Als u dit artikel nuttig blijft bezoeken Object Rocket voor meer database gerelateerde artikelen.
Als u advies of hulp nodig bij het beheer van uw database beveiliging, schaalbaarheid, of back-ups aarzel dan niet om contact met ons op Object Rocket.