Indledning

I denne artikel vil jeg introducere dig til Mongodb-gruppe efter flere felter. For at forstå bedre først vil vi lære om aggregeringsfunktionen.

MongoDB Aggregeringsfunktion

Aggregeringsfunktioner bruges i GROUP BY-klausuler til at aggregere grupperede data. Aggregeringsfunktioner fungerer bedre, når de bruges sammen med GROUP BY-klausulen. Brugen af aggregeringsfunktionen er dog ikke begrænset til grupperede forespørgsler.

Når en aggregeringsfunktion bruges i en forespørgsel uden GROUP BY-klausulen, aggregerer aggregeringsfunktionen hele resultatsættet (alle rækker, der svarer til WHERE-klausulen). Hvis du ikke bruger GROUP BY-klausulen, kan nogle aggregerede funktioner på SELECT-listen kun bruges sammen med andre aggregerede funktioner. Derfor skal aggregatfunktionen bruge GROUP BY-klausulen for at oprette forbindelse til listen i SELECT-listen.

For eksempel kan AVG i en SELECT-liste i stedet for at bruge GROUP BY-klausulen kun svare til SUM, men den kan ikke svare til en bestemt kolonne.

MongoDB-aggregationsoperationen bruges til batchoperationer på data. Efter at samlingen er grupperet efter betingelse, udføres en række operationer såsom sum, gennemsnit og andre. Aggregeringsoperationer kan udføre komplekse samlingsoperationer, især til matematisk statistik og datamining.

Indgangen til aggregeringsoperationen i MongoDB er opsamlingsdokumentet. Output kan være et eller flere dokumenter. MongoDB tilbyder en meget kraftfuld aggregeringsoperation, der kan opdeles i tre kategorier:

  • Aggregationspipeline
  • Aggregationsoperation til enkeltbrug
  • MapReduce-programmeringsmodel

Mongodb Group by Multiple Fields

Den $-grupperingsoperator er en aggregator, der returnerer et nyt dokument. Det har sin egen operatør, vi kan få feltet i det aktuelle dokument ved hjælp af $ symbol + feltnavn. For at forstå MongoDB group by multiple fields først, skal vi se på en liste over alle operatorer, der kan bruges i $ group:

  • $ sum – Returnerer summen af alle numeriske felter.
  • $ avg – Beregner gennemsnittet mellem numeriske felter.
  • $ min – Returnerer minimumsværdien fra det numeriske felt
  • $ max – Henter maksimumsværdien fra det numeriske felt.
  • $ push – Indsætter feltets værdi i resultatfeltet
  • $ addToSet – Indsætter en værdi i et array i det resulterende dokument, men opretter ikke dubletter.
  • $ first – Henter kun det første dokument fra de grupperede dokumenter, normalt med henblik på sortering.
  • $ last – Henter det sidste dokument.

Aggregeringspipeline

I multitrådet POSIX-tilstand er der en metode kaldet en pipeline, hvis dataelementstrøm udføres sekventielt af et sæt tråde i den angivne rækkefølge. aggregeringspipeline består af en fase. Efter behandling af dokumentet i et trin overfører aggregeringspipelinen behandlingsresultatet til det næste trin.

Polymerrørsfunktion Filtrer dokumentet for at finde ud af, hvilke dokumenter der opfylder kriterierne. Konverter dokumentet og ændr dokumentets outputform.

Hvert niveau i aggregeringsrørledningen er defineret ved hjælp af trinoperatorer, og hver trinoperatør kan bruge udtryksoperatører til at beregne summen, gennemsnittet, sammenkædningen eller linjeskift før hvert niveau. Resultatet returneres til sidst, og det returnerede resultat kan udgives direkte eller gemmes i samlingen.

Behandlingsflow

  • Db.collection.aggregate () kan bruge flere kanaler på samme tid til databehandling.
  • Db.collection.aggregate () bruger MongoDB’s native operationer til effektivt at aggregere og understøtte operationer som GroupBy i SQL uden at skulle skrive brugerdefinerede JS-rutiner.
  • Hver fase i pipelinen begrænser 100 MB hukommelse. Hvis en enkeltknude-pipeline overskrider denne grænse, genererer MongoDB en fejl. Hvis du vil behandle store datamængder, skal du indstille egenskaben allowDiskUse til true for at skrive data til en midlertidig fil for en aggregeret rørknude og tillade en hukommelsesgrænse på 100 MB.
  • Db.collection.aggregate () kan anvendes på en serie af skiver, men resultatet kan ikke gå tabt i serien af skiver. MapReduce kan anvendes på en serie af skiver, og resultatet kan gå tabt i en serie af skiver.
  • Db.collection.aggregate () returnerer en cursor, dataene gemmes i hukommelsen og kan administreres direkte som MongoShell.
  • Opdatet af db.collection.aggregate () kan kun gemmes i ét dokument, og BSON-dokumentets størrelse er begrænset til 16 MB.

Grupperingsmetode

Anvendelse af grupperingsmetoden svarer til anvendelse af GROUP BY-klausulen i SQL. Grupperingsmetoden har tre parametre:

  • Nøgle: Viser gruppens nøgle
  • Initial: Viser gruppens nøgle
  • Initial: Initialiserer det dokumentfelt, der repræsenterer dokumentgruppen
  • Reducer: En funktion, der returnerer antallet af elementer. Denne funktion bruger to parametre som argumenter: det aktuelle element og det aggregerede resultatdokument for den aktuelle gruppe.
  • Keyf: valgfri parameter. Brug en anden funktion end nøgleargumentet til at repræsentere det returnerede nøgleobjekt.
  • Cond: valgfri parameter. Angiver, at betingelsen skal returnere sand, ellers vil dokumentet ikke deltage i grupperingen. Hvis denne parameter ikke er angivet, deltager alle dokumenter i grupperingen.
  • Finalize: valgfri parameter. Dette repræsenterer en funktion, der udløses, før der returneres et grupperet resultat.

For eksempel:`js> db.users.group ({key: {name : true}, initial: {total : 0},reduce : function (curr, res){res.total += 1}}})`

Lad os tage et kig på udtrykket. Parameteren key angiver, at gruppen skal grupperes efter navn: key: {name: true}

Værdien af parameteren initial initialiserer de felter, der repræsenterer resultatdokumentet for gruppen. I dette tilfælde er den indledende værdi af feltet total indstillet. Dette felt angiver antallet af elementer i gruppen. Da der måske ikke er nogen elementer, initialiserer vi til nul.

Reducer-parameteren repræsenterer en funktion, hvor curr-parameteren peger på det aktuelle objekt i gruppen, og res repræsenterer den aktuelle gruppe. Hvis du finder et andet objekt med en bestemt værdi for feltet name, tilføjes dette dokument til gruppen, og den samlede værdi i res-dokumentet øges med 1.

Brug af $group

Den $group bruger _id til at angive det nøgle navn, der skal grupperes, ved hjælp af den brugerdefinerede feltstatistik. Brug af aggregeret operation vil rydde konceptet for Mongodb-gruppe efter flere felter.

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 } }
},{
$group : { _id:$username, count:{$sum:1} }
});
/// Mongodb group by multiple fields
db.users.aggregate({
$match: {age: {$gte:18} }}},
$group: {_id:{brugernavn:$brugernavn, alder:$ge}, ‘count’:{$sum:1} }
})
/// $sum:val Tilføj val til hvert dokument
/// $avg:val Gennemsnitlig værdi for hvert dokument
db.users.aggregate({$group: { _id:$username, count:{$avg:$age} }
})
db.users.aggregate({
$group: { _id:$username, count:{$max:$age} }
})
db.users.aggregate({$group: {_id:$username, count:{$min:$age} }
})
/// $first:val Bliv den første i gruppen
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 grupperer efter flere felter ved hjælp af Aggregate-operation

Først vælges den nøgle, som grupperingen er baseret på, og derefter opdeles samlingen i grupper i henhold til den valgte nøgleværdi. Derefter kan du oprette et slutdokument ved at aggregere dokumenterne i hver gruppe.

Gruppen understøtter ikke fragmenterede klynger og kan ikke udføre shard-gruppering. Hvis du har brug for distribueret understøttelse, skal du bruge aggregate eller mapReduce.

1
2
3
4
5
5
6
7
8
9
10
11
12
13
db.collection.group(document)
{
# Grupperingsfelt
key:{key1, key2:1},
# Forespørgselsbetingelser
cond:{},
# Aggregeringsfunktion
reduce:function(current, result){},
# initialisering
initial:{},
# Optælling Returfunktionssæt
finalize:function(){}
}

Beregne antallet af elementer i hver kolonne

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:{},// alle sammen
reduce:function(current, result){/// Svarende til den aktuelle linje,result Svarende til flere rækker i gruppen
result.total += 1;
},
initial:{total:0}
})

Slutning

Denne artikel er skrevet til udviklerne for at forstå Mongodb-gruppe efter flere felter ved hjælp af aggregatfunktion. Hvis du finder denne artikel nyttig, kan du fortsætte med at besøge Object Rocket for flere database-relaterede artikler.

Hvis du har brug for råd eller hjælp til at administrere din database sikkerhed, skalerbarhed eller sikkerhedskopiering, så tøv ikke med at kontakte os på Object Rocket.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.