Mongodb: birden fazla alana göre nasıl gruplandırılır
MongoDB’de birden fazla alanı gruplamak ve toplama gerçekleştirmek için aşağıdaki sözdizimini kullanabilirsiniz:
db.collection.aggregate([ { $group : { _id :{field1:" $field1 ", field2:" $field2 "}, count :{ $sum :1}}} ])
Aşağıdaki örnekler, bu sözdiziminin aşağıdaki belgelere sahip bir koleksiyon ekibiyle nasıl kullanılacağını gösterir:
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 })
Örnek 1: birkaç alana göre gruplandırın ve toplayın
“Takım” ve “pozisyon”a göre gruplamak ve her gruplamanın oluşumlarını saymak için aşağıdaki kodu kullanabiliriz:
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, count :{ $sum :1}}} ])
Bu, aşağıdaki sonuçları döndürür:
{ _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 }
Farklı bir toplama da yapabiliriz. Örneğin, “takıma” ve pozisyona göre gruplandırabilir ve gruplandırarak “puanların” toplamını bulabiliriz:
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, sumPoints :{ $sum : " $points "}}} ])
Bu, aşağıdaki sonuçları döndürür:
{ _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 }
Bu bize şunu söylüyor:
- ‘Rockets’ oyuncularının ‘Forvet’ pozisyonunda kazandığı puanların toplamı 33’tür .
- ‘Guard’ pozisyonundaki ‘Mavs’ oyuncularının aldığı puanların toplamı 53 oldu.
Ve benzeri.
Örnek 2: birkaç alana göre gruplandırın ve toplayın (sonra sıralayın)
“Takım” ve pozisyona göre gruplamak ve gruplandırarak “puanların” toplamını bulmak ve ardından sonuçları “puanlara” göre artan sırada sıralamak için aşağıdaki kodu kullanabiliriz:
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, sumPoints :{ $sum : " $points "}}}, { $sort : { sumPoints :1}} ])
Bu, aşağıdaki sonuçları döndürür:
{ _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 }
Sonuçları azalan düzende noktalara göre sıralamak için -1’i kullanabiliriz:
db.teams.aggregate([ { $group : { _id : {team: " $team ", position: " $position "}, sumPoints :{ $sum : " $points "}}}, { $sort : { sumPoints :-1}} ])
Bu, aşağıdaki sonuçları döndürür:
{ _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 }
Not : $group’un tüm belgelerini burada bulabilirsiniz.