MongoDB:n aggre­goin­ti on arvokas työkalu tie­to­kan­to­jen ana­ly­soin­tiin ja suo­dat­ta­mi­seen. Put­ki­jär­jes­tel­män avulla on mah­dol­lis­ta määrittää kyselyitä, mikä mah­dol­lis­taa erittäin rää­tä­löi­dyt tulokset.

Mitä on aggre­goin­ti MongoDB:ssä?

MongoDB on ei-re­laa­tio­naa­li­nen ja asia­kir­joi­hin perustuva tie­to­kan­ta, joka on suun­ni­tel­tu käy­tet­tä­väk­si suurten ja mo­ni­puo­lis­ten tie­to­mää­rien kanssa. Luo­pu­mal­la jäykistä tau­lu­kois­ta ja käyt­tä­mäl­lä tek­nii­koi­ta kuten sharding (tietojen tal­len­ta­mi­nen eri solmuihin), NoSQL-ratkaisu voi skaa­lau­tua vaa­ka­suun­nas­sa säi­lyt­täen samalla suurta jous­ta­vuut­ta ja vi­ka­sie­toi­suut­ta.

BSON-bi­naa­ri­muo­toi­set JSON-tiedostot on koottu ko­koel­miin, ja niitä voidaan hakea ja muokata MongoDB Query Language (MQL) -kielellä. Vaikka tämä kieli tarjoaa monia vaih­toeh­to­ja, se ei sovellu (tai ei ehkä sovellu tarpeeksi hyvin) tietojen ana­ly­soin­tiin. Siksi MongoDB tarjoaa aggre­goin­nin.

Tie­to­tek­nii­kas­sa tämä termi viittaa eri­lai­siin pro­ses­sei­hin. MongoDB:ssä aggre­goin­ti tar­koit­taa tietojen ana­ly­soin­tia ja yh­teen­ve­toa käyt­tä­mäl­lä erilaisia ope­raa­tioi­ta yhden selkeän tuloksen tuot­ta­mi­sek­si. Tämän prosessin aikana yhden tai useamman do­ku­men­tin tiedot ana­ly­soi­daan ja suo­da­te­taan käyttäjän mää­rit­te­le­mien te­ki­jöi­den mukaan.

Seu­raa­vis­sa osioissa tar­kas­te­lem­me paitsi MongoDB-aggre­gaa­tion tarjoamia mah­dol­li­suuk­sia kattavaan data-ana­lyy­siin, myös annamme esi­merk­ke­jä siitä, miten voit käyttää aggregate ( ) tie­to­kan­nan hal­lin­ta­jär­jes­tel­mäs­sä.

Mitä tarvitsen MongoDB-aggre­gaa­tio­ta varten?

MongoDB:ssä aggre­goin­nin käyttöön on vain muutamia vaa­ti­muk­sia. Menetelmä suo­ri­te­taan ko­men­to­tul­kis­sa ja toimii loogisten sääntöjen mu­kai­ses­ti, jotka voit rää­tä­löi­dä ana­lyy­si­si tarpeiden mukaan.

Jotta voit käyttää aggre­goin­tia Mongo DB:ssä, sinun on asen­net­ta­va MongoDB tie­to­ko­neel­le­si. Jos se ei ole vielä asennettu, voit lukea kat­ta­vas­ta MongoDB-op­paas­tam­me, miten voit ladata, asentaa ja käyttää tie­to­kan­taa.

Käytä myös tehokasta pa­lo­muu­ria ja varmista, että tie­to­kan­ta on mää­ri­tet­ty kaikkien nykyisten tur­val­li­suuss­tan­dar­dien mu­kai­ses­ti. Aggre­gaa­tion suo­rit­ta­mi­nen MongoDB:ssä edel­lyt­tää jär­jes­tel­män­val­vo­jan oikeuksia.

Tie­to­kan­ta toimii kaikilla alus­toil­la, joten alla kuvatut vaiheet koskevat kaikkia käyt­tö­jär­jes­tel­miä.

Mikä on MongoDB-aggre­gaa­tio­ke­hyk­sen putki?

MongoDB:ssä voit suorittaa yk­sin­ker­tai­sia hakuja tai kyselyjä, ja tie­to­kan­ta näyttää tulokset vä­lit­tö­mäs­ti. Tämä menetelmä on kuitenkin hyvin ra­joi­tet­tu, koska se voi näyttää vain tuloksia, jotka jo ovat tal­len­net­tu­jen asia­kir­jo­jen sisällä. Tämän tyyppistä kyselyä ei ole tar­koi­tet­tu sy­väl­li­seen ana­lyy­siin, tois­tu­vien mallien et­si­mi­seen tai li­sä­tie­to­jen hank­ki­mi­seen.

Joskus tie­to­kan­nan eri lähteet on otettava huomioon, jotta voidaan tehdä mer­ki­tyk­sel­li­siä joh­to­pää­tök­siä. MongoDB-aggre­gaa­tio­ta käytetään täl­lai­sis­sa ti­lan­teis­sa. Täl­lais­ten tulosten saa­vut­ta­mi­sek­si aggregate ( ) me­ne­tel­mäs­sä käytetään put­kis­to­ja.

Put­ki­lin­jan rooli

MongoDB:n aggre­goin­ti­put­ket ovat pro­ses­se­ja, joissa olemassa olevia tietoja ana­ly­soi­daan ja suo­da­te­taan eri vaiheiden avulla, jotta käyt­tä­jil­le voidaan näyttää heidän etsimänsä tulos. Näitä vaiheita kutsutaan vaiheiksi. Vaa­ti­muk­sis­ta riippuen voidaan käyn­nis­tää yksi tai useampi vaihe. Ne suo­ri­te­taan peräkkäin ja muuttavat al­ku­pe­räis­tä syö­tet­tä­si, jotta lop­pu­tu­los (etsimäsi tiedot) voidaan näyttää lopussa.

Vaikka syöte koostuu lu­kui­sis­ta tiedoista, tulos (eli lop­pu­tu­los) on yk­sit­täi­nen. Selitämme MongoDB-aggre­gaa­tion eri vaiheet myöhemmin tässä osiossa.

MongoDB-aggre­gaa­tio­put­ken syntaksi

En­sin­nä­kin on syytä tar­kas­tel­la lyhyesti MongoDB:n aggre­goin­nin syntaksia. Menetelmä on aina ra­ken­net­tu saman mallin mukaan ja sitä voidaan mukauttaa asiakkaan eri­tyis­tar­pei­siin. Pe­rus­ra­ken­ne on seu­raa­van­lai­nen:

db.collection_name.aggregate ( pipeline, options )
shell

Tässä collection_name on kyseisen kokoelman nimi. MongoDB-aggre­gaa­tion vaiheet on lueteltu kohdassa pipeline. options voidaan käyttää li­sä­pa­ra­met­reil­le, jotka mää­rit­te­le­vät tu­los­tuk­sen.

Put­ki­lin­jan vaiheet

MongoDB:n aggre­goin­ti­put­kes­sa on lukuisia vaiheita. Suurinta osaa niistä voidaan käyttää useita kertoja putken sisällä. Kaikkien vaih­toeh­to­jen luet­te­le­mi­nen tässä ar­tik­ke­lis­sa olisi liian laaja tehtävä, varsinkin kun jotkut vaih­toeh­dot ovat tarpeen vain hyvin eri­tyi­sis­sä toi­min­nois­sa. Jotta saatte kuitenkin kä­si­tyk­sen vaiheista, luet­te­lem­me tässä muutamia useimmin käy­tet­ty­jä vaih­toeh­to­ja:

  • $count: Tässä vaiheessa saat tiedon siitä, kuinka monta BSON-asia­kir­jaa on otettu huomioon ky­sei­ses­sä vaiheessa tai vaiheissa.
  • $group: Tässä vaiheessa asia­kir­jat la­ji­tel­laan ja ni­pu­te­taan tiettyjen pa­ra­met­rien mukaan.
  • $limit: Rajoittaa putken seu­raa­vaan vai­hee­seen siir­ret­tä­vien do­ku­ment­tien määrää.
  • $match: $match-vaiheen avulla rajoitat seu­raa­vas­sa vaiheessa käy­tet­tä­viä asia­kir­jo­ja.
  • $out: Tässä vaiheessa MongoDB-aggre­gaa­tion tulokset si­säl­ly­te­tään ko­koel­maan. Tätä vaihetta voidaan käyttää vain put­ki­lin­jan lopussa.
  • $project: Käytä $project-vaihetta va­li­tak­se­si tiettyjä kenttiä ko­koel­mas­ta.
  • $skip: Tässä vaiheessa ohitetaan tietty määrä asia­kir­jo­ja. Voit määrittää tämän vaih­toeh­dol­la.
  • $sort: Tämä toiminto la­jit­te­lee asia­kir­jat käyttäjän ko­koel­mas­sa. Asia­kir­jo­ja ei kui­ten­kaan muuteta tämän lisäksi.
  • $unset: $unset sulkee pois tietyt kentät. Se tekee päin­vas­toin kuin $project.

Esimerkki aggre­goin­nis­ta MongoDB:ssä

Jotta voisit paremmin ymmärtää, miten aggre­goin­ti MongoDB:ssä toimii, esit­te­lem­me sinulle muutamia esi­merk­ke­jä eri vaiheista ja niiden käytöstä. Käyt­tääk­se­si MongoDB-aggre­goin­tia, avaa ko­men­to­ri­vi jär­jes­tel­män­val­vo­ja­na. Nor­maa­lis­ti tes­ti­tie­to­kan­ta näkyy en­sim­mäi­se­nä. Jos haluat käyttää eri tie­to­kan­taa, käytä komentoa use.

Tässä esi­mer­kis­sä ku­vi­tel­laan tie­to­kan­ta, joka sisältää tietoja asiak­kais­ta, jotka ovat ostaneet tietyn tuotteen. Yk­sin­ker­tai­suu­den vuoksi tie­to­kan­nas­sa on vain kymmenen asia­kir­jaa, jotka ovat kaikki ra­ken­teel­taan sa­man­lai­sia:

{
	"name" : "Smith",
	"city" : "Glasgow",
	"country" : "Scotland",
	"quantity" : 14
}
shell

Seuraavat tiedot asiak­kais­ta on si­säl­ly­tet­ty: heidän nimensä, asuin­paik­kan­sa, maansa ja os­ta­mien­sa tuot­tei­den lukumäärä.

Jos haluat kokeilla aggre­goin­tia MongoDB:ssä, voit käyttää me­ne­tel­mää insertMany ( ) li­sä­täk­se­si kaikki asia­kas­da­taa si­säl­tä­vät do­ku­men­tit ko­koel­maan nimeltä ”customers”:

db.customers.insertMany ( [
	{ "name" : "Smith", "city" : "Glasgow", "country" : "Scotland", "quantity" : 14 },
	{ "name" : "Meyer", "city" : "Hamburg", "country" : "Germany", "quantity" : 26 },
	{ "name" : "Lee", "city" : "Birmingham", "country" : "England", "quantity" : 5 },
	{ "name" : "Rodriguez", "city" : "Madrid", "country" : "Spain", "quantity" : 19 },
	{ "name" : "Nowak", "city" : "Krakow", "country" : "Poland", "quantity" : 13 },
{ "name" : "Rossi", "city" : "Milano", "country" : "Italy", "quantity" : 10 },
{ "name" : "Arslan", "city" : "Ankara", "country" : "Turkey", "quantity" : 18 },
{ "name" : "Martin", "city" : "Lyon", "country" : "France", "quantity" : 9 },
{ "name" : "Mancini", "city" : "Rome", "country" : "Italy", "quantity" : 21 },
{ "name" : "Schulz", "city" : "Munich", "country" : "Germany", "quantity" : 2 }
] )
shell

Näkyviin tulee luettelo kunkin asia­kir­jan ob­jek­ti­tun­nuk­sis­ta.

Kuinka käyttää $match-komentoa

MongoDB:n aggre­goin­ti­mah­dol­li­suuk­sien ha­vain­nol­lis­ta­mi­sek­si so­vel­lam­me ensin $match-vaihetta asiak­kai­den ko­koel­maan. Ilman li­sä­pa­ra­met­re­ja tämä tuottaa yk­sin­ker­tai­ses­ti yllä luetellun täy­del­li­sen luettelon asia­kas­tie­dois­ta.

Seu­raa­vas­sa esi­mer­kis­sä olemme kuitenkin antaneet sille ohjeen näyttää vain ita­lia­lai­set asiakkaat. Tässä on komento:

db.customers.aggregate ( [
	{ $match : { "country" : "Italy" } }
] )
shell

Nyt näytetään vain kahden ita­lia­lai­sen asiakkaan ob­jek­ti­tun­nuk­set ja tiedot.

Käytä $sort-komentoa paremman yleis­ku­van saa­mi­sek­si

Jos haluat järjestää asia­kas­tie­to­kan­ta­si, voit käyttää $sort-vaihetta. Seu­raa­vas­sa esi­mer­kis­sä oh­jeis­tam­me jär­jes­tel­mää la­jit­te­le­maan kaikki asia­kas­tie­dot os­tet­tu­jen yk­si­köi­den määrän mukaan, alkaen suu­rim­mas­ta määrästä. Syöte näyttää tältä:

db.customers.aggregate ( [
	{ $sort : { "quantity" : -1 } }
] )
shell

Rajoita tulostus $project-ko­men­nol­la

Tähän mennessä käy­tet­ty­jen vaiheiden avulla tulos on suh­teel­li­sen laaja. Esi­mer­kik­si asia­kir­jo­jen var­si­nais­ten tietojen lisäksi myös objektin tunnus tu­los­te­taan aina. MongoDB-aggre­gaa­tio­put­kes­sa voit käyttää $project-komentoa mää­rit­tääk­se­si, mitkä tiedot tu­los­te­taan. Tätä varten asetamme arvon 1 pa­kol­li­sil­le kentille ja arvon 0 kentille, joita ei tarvitse si­säl­lyt­tää tu­los­tuk­seen. Esi­mer­kis­säm­me haluamme nähdä vain asiakkaan nimen ja os­tet­tu­jen tuot­tei­den lu­ku­mää­rän. Tätä varten syötämme seuraavan:

db.customers.aggregate ( [
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
] )
shell

Yhdistä useita vaiheita aggre­goin­nil­la MongoDB:ssä

MongoDB-aggre­gaa­tios­sa on myös mah­dol­lis­ta soveltaa useita vaiheita peräkkäin. Nämä suo­ri­te­taan sitten yksi toisensa jälkeen, ja lopuksi saadaan tulos, jossa kaikki halutut pa­ra­met­rit on otettu huomioon. Jos esi­mer­kik­si haluat näyttää vain skot­lan­ti­lais­ten asiak­kai­den nimet ja ostokset las­ke­vas­sa jär­jes­tyk­ses­sä, voit käyttää edellä kuvattuja vaiheita seu­raa­vas­ti:

db.customers.aggregate ( [
	{ $match : { "country" : "Scotland" } }
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
	{ $sort : { "quantity" : -1 } }
] )
shell

c067e5f69d02a3c1a1a58911f79850cc

Siirry pää­va­lik­koon