Kokoamisputki on suositeltu tapa suorittaa monimutkaisia kyselyitä MongoDB:ssä. Jos olet käyttänyt MongoDB:n MapReducea, sinun on parempi vaihtaa aggregointiputkeen tehostaaksesi laskentaa.
MUO päivän video JATKA SISÄLLÖLLÄ VIERÄTÄ
Mikä on aggregointi MongoDB:ssä ja miten se toimii?
Yhdistelmäputki on monivaiheinen prosessi edistyneen suorittamiseen kyselyt MongoDB:ssä . Se käsittelee tietoja eri vaiheissa, joita kutsutaan liukuhihnaksi. Voit käyttää yhdeltä tasolta luotuja tuloksia toimintamallina toisella.
Voit esimerkiksi siirtää täsmäysoperaation tuloksen toiseen vaiheeseen lajittelua varten, kunnes saat halutun tulosteen.
Aggregointiputkiston jokaisessa vaiheessa on MongoDB-operaattori ja se luo yhden tai useamman muunnetun asiakirjan. Kyselystäsi riippuen taso voi esiintyä käsittelyssä useita kertoja. Saatat joutua käyttämään esimerkiksi $count tai $lajittele operaattorin vaiheet useammin kuin kerran kokoamisputken poikki.
Aggregointiputkilinjan vaiheet
Kokoamisputki kuljettaa tiedot useiden vaiheiden läpi yhdessä kyselyssä. Vaiheita on useita, ja niiden tiedot löydät kohdasta MongoDB-dokumentaatio .
Määritellään alla joitain yleisimmin käytetyistä.
$ottelun vaihe
Tämä vaihe auttaa sinua määrittämään tietyt suodatusehdot ennen muiden yhdistämisvaiheiden aloittamista. Voit käyttää sitä valitsemaan vastaavat tiedot, jotka haluat sisällyttää yhdistämisprosessiin.
$ryhmävaihe
Ryhmävaihe jakaa tiedot eri ryhmiin tiettyjen kriteerien perusteella käyttämällä avainarvopareja. Jokainen ryhmä edustaa avainta tulosteen asiakirjassa.
Harkitse esimerkiksi seuraavaa myynti esimerkkitiedot:
Yhdistelmäputken avulla voit laskea kunkin tuoteosion kokonaismyyntimäärän ja suurimman myynnin:
paras ilmainen ftp -asiakas Macille
{
$group: {
_id: $Section,
total_sales_count: {$sum : $Sold},
top_sales: {$max: $Amount},
}
}
The _id: $Section pari ryhmittelee tulosteen osioiden perusteella. Määrittämällä suurin_myynnin_määrä ja top_sales kentät, MongoDB luo uusia avaimia aggregaattorin määrittämän toiminnon perusteella; tämä voi olla $summa , $min , $ max , tai $keskim .
$skip-vaihe
Voit käyttää $ohita vaihe, jos haluat jättää tietyn määrän asiakirjoja tulosteesta. Se tulee yleensä ryhmävaiheen jälkeen. Jos esimerkiksi odotat kahta tulostusasiakirjaa, mutta ohitat yhden, yhdistäminen tulostaa vain toisen asiakirjan.
Lisää ohitusvaihe lisäämällä $ohita toiminta yhdistämisputkiin:
...,
{
$skip: 1
},
$sort Stage
Lajitteluvaiheessa voit järjestää tiedot laskevaan tai nousevaan järjestykseen. Voimme esimerkiksi lajitella edellisen kyselyesimerkin tietoja edelleen laskevaan järjestykseen määrittääksemme, mikä osio on myynyt eniten.
Lisää $lajittele operaattori edelliseen kyselyyn:
...,
{
$sort: {top_sales: -1}
},
$limit-vaihe
Rajoitustoiminto auttaa vähentämään tulosasiakirjojen määrää, jotka haluat kokoamisliukuhihnan näyttävän. Käytä esimerkiksi $rajoitus operaattori saadakseen edellisen vaiheen palautuneen osion, jonka myynti on suurin:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Yllä oleva palauttaa vain ensimmäisen asiakirjan; tämä on eniten myyty osio, kuten se näkyy lajiteltujen tulosteiden yläosassa.
$projektin vaihe
The $projekti vaiheessa voit muotoilla tulosteen haluamallasi tavalla. Käyttämällä $projekti -operaattorilla, voit määrittää, mikä kenttä tulosteeseen sisällytetään, ja mukauttaa sen avaimen nimeä.
Esimerkiksi näytetuloste ilman $projekti vaihe näyttää tältä:
Katsotaan miltä se näyttää kanssa $projekti vaiheessa. Voit lisätä $projekti putkeen:
...,
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Koska olemme aiemmin ryhmitellyt tiedot tuoteosien perusteella, yllä oleva sisältää jokaisen tuoteosion tulosasiakirjassa. Se varmistaa myös, että yhteenlaskettu myyntimäärä ja huippumyynnit näkyvät lähdössä as TotalSold ja TopSale .
Lopputulos on paljon puhtaampi verrattuna edelliseen:
$unwind Stage
The $rentoudu vaihe hajottaa asiakirjassa olevan taulukon yksittäisiksi asiakirjoiksi. Ota seuraava Tilaukset dataa, esimerkiksi:
Käytä $rentoudu vaiheessa purkaa kohteita ennen muiden yhdistämisvaiheiden käyttöä. Esimerkiksi purkamalla kohteita matriisi on järkevä, jos haluat laskea kunkin tuotteen kokonaistulot:
db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},
{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",
}
}
])
Tässä on yllä olevan koontikyselyn tulos:
Kuinka luoda aggregointiputki MongoDB:ssä
Vaikka yhdistämisputki sisältää useita toimintoja, aiemmin esitellyt vaiheet antavat sinulle käsityksen siitä, kuinka niitä käytetään liukuhihnassa, mukaan lukien peruskysely jokaiselle.
Käyttämällä edellistä myynti tietonäyte, tarkastellaan joitain yllä käsitellyistä vaiheista yhtenä kappaleena saadaksesi laajemman kuvan aggregointiputkistosta:
db.sales.aggregate([
{
"$match": {
"Sold": { "$gte": 5 }
}
},
{
"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },
}
},
{
"$sort": { "top_sales": -1 }
},
{"$skip": 0},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
])
Lopullinen tulos näyttää siltä, mitä olet nähnyt aiemmin:
Aggregation Pipeline vs. MapReduce
MongoDB 5.0:sta alkaen sen poistumiseen asti tavanomainen tapa koota tietoja MongoDB:ssä oli MapReduce. Siitä huolimatta MapReducella on laajempia sovelluksia MongoDB:n lisäksi se on vähemmän tehokas kuin aggregointiputki, ja se vaatii kolmannen osapuolen komentosarjat kartan kirjoittamiseen ja toimintojen vähentämiseen erikseen.
Yhdistelmäputki puolestaan on vain MongoDB: lle. Mutta se tarjoaa puhtaamman ja tehokkaamman tavan suorittaa monimutkaisia kyselyjä. Yksinkertaisuuden ja kyselyn skaalautuvuuden lisäksi esitellyt liukuhihnavaiheet tekevät tuotosta paremmin muokattavissa.
On monia muitakin erot yhdistämisputkien ja MapReducen välillä . Näet ne, kun siirryt MapReduce-sovelluksesta yhdistämisprosessiin.
Tee Big Data -kyselyistä tehokkaita MongoDB:ssä
Kyselysi on oltava mahdollisimman tehokas, jos haluat suorittaa perusteellisia laskelmia monimutkaisista tiedoista MongoDB:ssä. Aggregointiputkisto on ihanteellinen edistyneeseen kyselyyn. Sen sijaan, että käsittelet tietoja erillisissä toiminnoissa, mikä usein heikentää suorituskykyä, yhdistämisen avulla voit pakata ne kaikki yhteen suoritusputkeen ja suorittaa ne kerran.
Vaikka kokoamisputki on tehokkaampi kuin MapReduce, voit tehdä yhdistämisestä nopeampaa ja tehokkaampaa indeksoimalla tietosi. Tämä rajoittaa MongoDB:n skannattavan tiedon määrää kunkin yhdistämisvaiheen aikana.