Mongodb: groeperen op meerdere velden
U kunt de volgende syntaxis gebruiken om meerdere velden te groeperen en aggregatie uit te voeren in MongoDB:
db.collection.aggregate([ { $group : { _id :{field1:" $field1 ", field2:" $field2 "}, count :{ $sum :1}}} ])
De volgende voorbeelden laten zien hoe u deze syntaxis kunt gebruiken met een incassoteam met de volgende documenten:
db.teams.insertOne({team: " Mavs ", position: " Guard ", points: 31 }) db.teams.insertOne({team: " Mavs ", position: " Guard ", points: 22 }) db.teams.insertOne({team: " Mavs ", position: " Forward ", points: 19 }) db.teams.insertOne({team: " Rockets ", position: " Guard ", points: 26 }) db.teams.insertOne({team: " Rockets ", position: " Forward ", points: 33 })
Voorbeeld 1: groeperen op verschillende velden en aggregeren
We kunnen de volgende code gebruiken om te groeperen op „team“ en „positie“ en het aantal keren dat elke groepering voorkomt te tellen:
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, count :{ $sum :1}}} ])
Dit levert de volgende resultaten op:
{ _id: { team: ' Rockets ', position: ' Forward ' }, count: 1 } { _id: { team: ' Mavs ', position: ' Guard ' }, count: 2 } { _id: { team: ' Mavs ', position: ' Forward ' }, count: 1 } { _id: { team: ' Rockets ', position: ' Guard ' }, count: 1 }
We zouden ook een andere aggregatie kunnen doen. We kunnen bijvoorbeeld groeperen op ‘team’ en positie’ en de som van ‘punten’ vinden door het volgende te groeperen:
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, sumPoints :{ $sum : " $points "}}} ])
Dit levert de volgende resultaten op:
{ _id: { team: ' Rockets ', position: ' Forward ' }, sumPoints: 33 } { _id: { team: ' Mavs ', position: ' Guard ' }, sumPoints: 53 } { _id: { team: ' Mavs ', position: ' Forward ' }, sumPoints: 19 } { _id: { team: ' Rockets ', position: ' Guard ' }, sumPoints: 26 }
Dit vertelt ons:
- De som van de punten gescoord door de ‚Rockets‘-spelers in de ‚Forward‘-positie is 33 .
- De som van de punten gescoord door de ‚Mavs‘-spelers in de ‚Guard‘-positie is 53 .
Enzovoort.
Voorbeeld 2: groeperen op verschillende velden en aggregeren (en vervolgens sorteren)
We kunnen de volgende code gebruiken om te groeperen op „team“ en positie“ en de som van „punten“ te vinden door te groeperen, en vervolgens de resultaten te sorteren op „punten“ in oplopende volgorde :
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, sumPoints :{ $sum : " $points "}}}, { $sort : { sumPoints :1}} ])
Dit levert de volgende resultaten op:
{ _id: { team: ' Mavs ', position: ' Forward ' }, sumPoints: 19 } { _id: { team: ' Rockets ', position: ' Guard ' }, sumPoints: 26 } { _id: { team: ' Rockets ', position: ' Forward ' }, sumPoints: 33 } { _id: { team: ' Mavs ', position: ' Guard ' }, sumPoints: 53 }
We kunnen -1 gebruiken om de resultaten op punten in aflopende volgorde te sorteren:
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, sumPoints :{ $sum : " $points "}}}, { $sort : { sumPoints :-1}} ])
Dit levert de volgende resultaten op:
{ _id: { team: ' Mavs ', position: ' Guard ' }, sumPoints: 53 } { _id: { team: ' Rockets ', position: ' Forward ' }, sumPoints: 33 } { _id: { team: ' Rockets ', position: ' Guard ' }, sumPoints: 26 } { _id: { team: ' Mavs ', position: ' Forward ' }, sumPoints: 19 }
Opmerking : u kunt de volledige documentatie voor $group hier vinden.