Introducere

În acest articol vă voi prezenta gruparea Mongodb după mai multe câmpuri. Pentru a înțelege mai bine, mai întâi vom învăța despre funcția de agregare.

Funcția de agregare MongoDB

Funcțiile de agregare sunt utilizate în clauzele GROUP BY pentru a agrega date grupate. Funcțiile de agregare funcționează mai bine atunci când sunt utilizate cu clauza GROUP BY. Cu toate acestea, utilizarea funcției de agregare nu se limitează la interogări grupate.

Când o funcție de agregare este utilizată într-o interogare fără clauza GROUP BY, funcția de agregare agregă întregul set de rezultate (toate rândurile care corespund clauzei WHERE). Dacă nu utilizați clauza GROUP BY, unele funcții agregate din lista SELECT pot fi utilizate numai cu alte funcții agregate. De aceea, funcția de agregare trebuie să utilizeze clauza GROUP BY pentru a se conecta la lista din lista SELECT.

De exemplu, în loc să utilizeze clauza GROUP BY, AVG dintr-o listă SELECT poate corespunde numai cu SUM, dar nu poate corespunde unei coloane specifice.

Operațiunea de agregare MongoDB este utilizată pentru operații pe loturi asupra datelor. După ce colecția este grupată în funcție de condiție, se efectuează o serie de operații, cum ar fi suma, media și altele. Operațiunile de agregare pot efectua operații complexe de colectare, în special pentru statisticile matematice și extragerea datelor.

Intrarea operației de agregare în MongoDB este documentul colecției. Ieșirea poate fi unul sau mai multe documente. MongoDB oferă o operație de agregare foarte puternică, care poate fi împărțită în trei categorii:

  • Agregation pipeline
  • Operație de agregare pentru utilizare unică
  • Model de programare MapReduce

Mongodb Group by Multiple Fields

Operatorul de grupare $ este un agregator care returnează un nou document. Acesta are propriul său operator, putem obține câmpul documentului curent prin simbolul $ + numele câmpului. Pentru a înțelege mai întâi gruparea MongoDB prin mai multe câmpuri, să aruncăm o privire la o listă a tuturor operatorilor care pot fi utilizați în $ group:

  • $ sum – Returnează suma tuturor câmpurilor numerice.
  • $ avg – Calculează media între câmpurile numerice.
  • $ min – Returnează valoarea minimă din câmpul numeric
  • $ max – Obține valoarea maximă din câmpul numeric.
  • $ push – Inserează valoarea câmpului în câmpul rezultat
  • $ addToSet – Inserează o valoare într-un array din documentul rezultat, dar nu creează duplicate.
  • $ first – Obține numai primul document din cele grupate, de obicei pentru sortare.
  • $ last – Returnează ultimul document.

Canal de agregare

În modul POSIX multi-threaded, există o metodă numită pipeline, al cărei flux de elemente de date este executat secvențial de către un set de fire de execuție în ordinea specificată.

Canal de agregare constă dintr-o etapă. După procesarea documentului într-o etapă, conducta de agregare transferă rezultatul procesării către următoarea etapă.

Funcția de tub de polimerizare Filtrează documentul pentru a afla ce documente îndeplinesc criteriile. Convertește documentul și modifică forma de ieșire a documentului.

Care nivel al conductei de agregare este definit cu ajutorul operatorilor de etapă, iar fiecare operator de etapă poate utiliza operatori de expresie pentru a calcula suma, media, concatenarea sau întreruperile de linie înainte de fiecare nivel. Rezultatul este returnat la sfârșit, iar rezultatul returnat poate fi ieșit direct sau salvat în colecție.

Fluxul de procesare

  • Db.collection.aggregate () poate utiliza mai multe canale în același timp pentru procesarea datelor.
  • Db.collection.aggregate () utilizează operațiile native ale MongoDB pentru a agrega în mod eficient și a suporta operații precum GroupBy în SQL fără a fi nevoie să scrie rutine JS personalizate.
  • Care fază a pipeline-ului limitează 100 MB de memorie. Dacă un pipeline cu un singur nod depășește această limită, MongoDB generează o eroare. Pentru a procesa cantități mari de date, setați proprietatea allowDiskUse la true pentru a scrie datele într-un fișier temporar pentru un nod de conductă agregat și permiteți o limită de memorie de 100 MB.
  • Db.collection.aggregate () poate fi aplicat la o serie de felii, dar rezultatul nu se poate pierde în seria de felii. MapReduce poate fi aplicat unei serii de felii, iar rezultatul poate fi pierdut într-o serie de felii.
  • Db.collection.aggregate () returnează un cursor, datele sunt stocate în memorie și pot fi gestionate direct ca MongoShell.
  • Lovitura din db.collection.aggregate () poate fi salvată doar într-un singur document, iar dimensiunea documentului BSON este limitată la 16 MB.

Metoda de grupare

Utilizarea metodei de grupare este similară cu utilizarea clauzei GROUP BY în SQL. Metoda de grupare are trei parametri:

  • Key: Afișează cheia grupului
  • Initial: Inițializează câmpul document care reprezintă grupul de documente
  • Reduce: O funcție care returnează numărul de elemente. Această funcție utilizează doi parametri ca argumente: elementul curent și documentul rezultat agregat pentru grupul curent.
  • Keyf: parametru opțional. Utilizați o altă funcție decât argumentul cheie pentru a reprezenta obiectul cheie de returnare.
  • Cond: parametru opțional. Specifică faptul că condiția trebuie să returneze true, în caz contrar documentul nu va participa la grupare. Dacă acest parametru nu este specificat, toate documentele participă la grupare.
  • Finalize: parametru opțional. Acesta reprezintă o funcție care este declanșată înainte de a returna un rezultat grupat.

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

Să ne uităm la expresie. Parametrul key specifică faptul că grupul va fi grupat în funcție de nume: key: {name: true}

Valoarea parametrului initial inițializează câmpurile care reprezintă documentul rezultat pentru grup. În acest caz, se stabilește valoarea inițială a câmpului total. Acest câmp indică numărul de elemente din grup. Deoarece este posibil să nu existe niciun element, se inițializează la zero.

Parametrul reduce reprezintă o funcție în care parametrul curr indică obiectul curent din grup, iar res reprezintă grupul curent. Dacă găsiți un alt obiect cu o valoare specifică pentru câmpul name, adăugați acel document la grup și creșteți valoarea totală din documentul res cu 1.

Utilizarea lui $group

Grupul $group folosește _id pentru a specifica numele cheii care urmează să fie grupate, folosind statisticile câmpului personalizat. Utilizarea operației agregate va șterge conceptul de grupare Mongodb după mai multe câmpuri.

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 grupează după mai multe câmpuri
db.users.aggregate({
$match: {age: {$gte:18} }}},
$group: {_id:{_id:{utilizator:$utilizator, vârstă:$ge}, ‘count’:{$sum:1} }
}})
// $sum:val Adaugă val la fiecare document
// $avg:val Media valorii fiecărui document
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 Devine primul din grup
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:{$addToSet: $age} }
})
db.users.aggregate({
$group:{_id:$username, count:{$push: $age} }
})

Mongodb grupează după mai multe câmpuri folosind operația Aggregate

În primul rând, se selectează cheia pe care se bazează gruparea și apoi colecția este împărțită în grupuri în funcție de valoarea cheii selectate. Se poate crea apoi un document final prin agregarea documentelor din fiecare grup.

Grupul nu acceptă clustere fragmentate și nu poate efectua gruparea shard. Dacă aveți nevoie de suport distribuit, trebuie să utilizați agregate sau mapReduce.

1
2
3
4
5
6
7
8
9
10
11
12
13
db.collection.group(document)
{
# Câmpul de grupare
key:{key1, key2:1},
# Condiții de interogare
cond:{},
# Funcție de agregare
reduce:function(current, result){},
# inițializare
initial:{},
# Set de funcții de întoarcere a numărătorii
finalize:function(){}
}
}}.

Calculează numărul de elemente din fiecare coloană

.

1
2
3
3
4
5
6
7
8
9
SELECT COUNT(*) FROM goods GROUP BY category_id;
db.goods.group({
key:{category_id:1},
cond:{},// all together
reduce:function(current, result){// Corespunde la rândul curent,result Corespunde la mai multe rânduri din grup
result.total += 1;
},
initial:{total:0}
}})

Concluzie

Acest articol este scris pentru ca dezvoltatorii să înțeleagă gruparea Mongodb după mai multe câmpuri folosind funcția de agregare. Dacă acest articol vi s-a părut util, continuați să vizitați Object Rocket pentru mai multe articole legate de baze de date.

Dacă aveți nevoie de sfaturi sau ajutor în gestionarea securității, scalabilității sau backup-urilor bazei de date, nu ezitați să ne contactați la Object Rocket.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.