Introduction
Tässä artikkelissa esittelen sinulle Mongodb group by multiple fields. Jotta ymmärtäisimme paremmin ensin opimme aggregaatiofunktiosta.
MongoDB:n aggregaatiofunktio
Aggregointifunktioita käytetään GROUP BY -lausekkeissa ryhmiteltyjen tietojen aggregointiin. Aggregaatiofunktiot toimivat paremmin, kun niitä käytetään GROUP BY -lausekkeen kanssa. Aggregaattifunktion käyttö ei kuitenkaan rajoitu vain ryhmiteltyihin kyselyihin.
Kun aggregaattifunktiota käytetään kyselyssä ilman GROUP BY -lauseketta, aggregaattifunktio aggregoi koko tulosjoukon (kaikki WHERE-lausekkeen mukaiset rivit). Jos et käytä GROUP BY -lauseketta, joitakin SELECT-luettelossa olevia aggregaattifunktioita voi käyttää vain muiden aggregaattifunktioiden kanssa. Siksi aggregaattifunktion on käytettävä GROUP BY -lauseketta, jotta se voi liittyä SELECT-luettelossa olevaan luetteloon.
SELECT-luettelossa oleva AVG voi esimerkiksi GROUP BY -lausekkeen sijasta vastata vain SUM-lauseketta, mutta se ei voi vastata tiettyä saraketta.
MongoDB:n aggregaatio-operaatiota käytetään tietoihin kohdistuviin eräoperaatioihin. Kun kokoelma on ryhmitelty ehdon mukaan, suoritetaan joukko operaatioita, kuten summa, keskiarvo ja muut. Aggregointioperaatioilla voidaan suorittaa monimutkaisia kokoelmatoimintoja, erityisesti matematiikan tilastoja ja tiedonlouhintaa varten.
MongoDB:ssä aggregaatio-operaation syötteenä on kokoelma-asiakirja. Tuloksena voi olla yksi tai useampi dokumentti. MongoDB tarjoaa erittäin tehokkaan aggregointioperaation, joka voidaan jakaa kolmeen kategoriaan:
- Aggregointiputki
- Aggregointioperaatio kertakäyttöön
- MapReduce-ohjelmointimalli
Mongodb-ryhmitys usean kentän mukaan
Yhdistelmäoperaattori $ on aggregaattori, joka palauttaa uuden dokumentin. Sillä on oma operaattorinsa, voimme saada nykyisen dokumentin kentän $-symbolilla + kentän nimi. Ymmärtääksemme ensin MongoDB:n ryhmittelyä useiden kenttien mukaan, tarkastellaan listaa kaikista operaattoreista, joita voidaan käyttää $-ryhmässä:
- $ sum – Palauttaa kaikkien numeeristen kenttien summan.
- $ avg – Laskee keskiarvon numeeristen kenttien välillä.
- $ min – Palauttaa numeerisen kentän pienimmän arvon
- $ max – Hae maksimiarvo numeerisesta kentästä.
- $ push – Lisää kentän arvon tuloskenttään
- $ addToSet – Lisää arvon tuloksena syntyvän asiakirjan arrayyn, mutta ei luo duplikaatteja.
- $ first – Ottaa ryhmitellyistä asiakirjoista vain ensimmäisen, yleensä lajittelua varten.
- $ last – Palauttaa viimeisen dokumentin.
Aggregointiputki
Monisäikeisessä POSIX-tilassa on olemassa menetelmä nimeltä putki, jonka dataelementtivirta suoritetaan peräkkäin joukolla säikeitä määrätyssä järjestyksessä.aggregointiputki koostuu vaiheesta. Kun asiakirja on käsitelty yhdessä vaiheessa, aggregaatioputki siirtää käsittelytuloksen seuraavaan vaiheeseen.
Polymeeriputkitoiminto Suodata asiakirja selvittääkseen, mitkä asiakirjat täyttävät kriteerit. Muuntaa asiakirjan ja muuttaa asiakirjan tulostusmuotoa.
Aggregointiputken jokainen taso määritellään vaiheoperaattoreiden avulla, ja kukin vaiheoperaattori voi käyttää lausekeoperaattoreita summan, keskiarvon, ketjuttamisen tai rivinvaihdon laskemiseen ennen kutakin tasoa. Tulos palautetaan lopussa, ja palautettu tulos voidaan tulostaa suoraan tai tallentaa kokoelmaan.
Käsittelyn kulku
- Db.collection.aggregate () voi käyttää useita kanavia samanaikaisesti tietojen käsittelyyn.
- Db.collection.aggregate () käyttää MongoDB:n natiivioperaatioita tehokkaaseen aggregaatioon ja tukee SQL:n GroupByn kaltaisia operaatioita ilman, että tarvitsee kirjoittaa mukautettuja JS-rutiineja.
- Jokainen putken vaihe rajoittaa 100 Mt muistia. Jos yhden solmun putkisto ylittää rajan, MongoDB tuottaa virheen. Jos haluat käsitellä suuria tietomääriä, aseta allowDiskUse-ominaisuuden arvoksi true, jolloin tiedot kirjoitetaan tilapäistiedostoon aggregoitua putkisolmua varten ja sallitaan 100 Mt:n muistirajoitus.
- Db.collection.aggregate () voidaan soveltaa viipaleiden sarjaan, mutta tulosta ei voi hukata viipaleiden sarjaan. MapReducea voidaan soveltaa viipaleiden sarjaan, eikä tulosta voi hukata viipaleiden sarjaan.
- Db.collection.aggregate () palauttaa kursorin, tiedot tallennetaan muistiin ja niitä voidaan hallita suoraan MongoShellinä.
- Db.collection.aggregate ():n tulostus voidaan tallentaa vain yhteen dokumenttiin, ja BSON-dokumentin koko on rajoitettu 16 MB:iin.
Ryhmittelymenetelmä
Ryhmittelymenetelmän käyttäminen on samanlaista kuin GROUP BY -lausekkeen käyttäminen SQL:ssä. Ryhmittelymenetelmällä on kolme parametria:
- Key: Näyttää ryhmän avaimen
- Initial: Initialisoi dokumenttikentän, joka edustaa dokumenttiryhmää
- Redusoi: Funktio, joka palauttaa elementtien määrän. Tämä funktio käyttää argumentteina kahta parametria: nykyistä elementtiä ja nykyisen ryhmän aggregoitua tulosdokumenttia.
- Keyf: Valinnainen parametri. Käytä muuta funktiota kuin key-argumenttia paluuavainobjektin esittämiseen.
- Cond: Valinnainen parametri. Määrittää, että ehdon tulee palauttaa true, muuten dokumentti ei osallistu ryhmittelyyn. Jos tätä parametria ei määritetä, kaikki asiakirjat osallistuvat ryhmittelyyn.
- Finalize: Valinnainen parametri. Tämä edustaa funktiota, joka käynnistetään ennen ryhmitellyn tuloksen palauttamista.
Esimerkiksi:`
js> db.users.group ({key: {name : true}, initial: {total : 0}},reduce : function (curr, res){res.total += 1}})`
Katsotaanpa lauseketta. Parametrilla key määritetään, että ryhmä ryhmitellään nimen perusteella: key: {name: true}
Parametrin initial arvo alustaa kentät, jotka edustavat ryhmän tulosdokumenttia. Tässä tapauksessa asetetaan total-kentän alkuarvo. Tämä kenttä ilmoittaa ryhmän elementtien lukumäärän. Koska elementtejä ei välttämättä ole yhtään, arvoksi alustetaan nolla.
Ruce-parametri edustaa funktiota, jossa curr-parametri osoittaa ryhmän nykyistä objektia ja res edustaa nykyistä ryhmää. Jos löydät toisen objektin, jolla on tietty arvo name-kentälle, lisää kyseinen dokumentti ryhmään ja lisää res-dokumentin kokonaisarvoa 1:llä.
$groupin käyttö
$group käyttää _id:tä määritelläkseen ryhmiteltävän avaimen nimen käyttäen mukautetun kentän tilastoja. Aggregaattioperaation käyttäminen poistaa käsitteen Mongodbin ryhmittely useiden kenttien mukaan.
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:{käyttäjätunnus:$käyttäjätunnus, ikä:$ge}, ’count’:{$sum:1} } }) // $sum:val Lisää val jokaiseen dokumenttiin // $avg:val Kunkin dokumentin keskiarvo 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 Tulee ryhmän ensimmäiseksi 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 ryhmittelee useiden kenttien mukaan käyttäen Aggregate-operaatiota
Ensin valitaan avain, johon ryhmittely perustuu, ja sen jälkeen kokoelma jaetaan ryhmiin valitun avainarvon mukaan. Tämän jälkeen voidaan luoda lopullinen asiakirja aggregoimalla kunkin ryhmän asiakirjat.
Ryhmittely ei tue fragmentoituja klustereita eikä se voi suorittaa shard-klusterointia. group(document)
{
# Ryhmittelykenttä
avain:{avain1, avain2:1},
# Kyselyehdot
ehto:{},
# Aggregaattifunktio
reduce:function(current, result){},
# alustaminen
initial:{},
# Laskennan palautusfunktiojoukko
finalize:function(){}
}
Lasketaan kohteiden lukumäärä kussakin sarakkeessa
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:{},// kaikki yhdessä reduce:function(current, result){// Vastaavat nykyistä riviä,result Vastaavat useita rivejä ryhmässä result.total += 1; }, initial:{total:0} }) |
Johtopäätös
Tämä artikkeli on kirjoitettu kehittäjille, jotta he ymmärtäisivät Mongodb:n ryhmittelyn useiden kenttien mukaan käyttäen aggregaattifunktiota. Jos pidät tätä artikkelia hyödyllisenä, jatka vierailua Object Rocketissa saadaksesi lisää tietokantaan liittyviä artikkeleita.
Jos tarvitset neuvoja tai apua tietokantasi tietoturvan, skaalautuvuuden tai varmuuskopioinnin hallintaan, älä epäröi ottaa yhteyttä Object Rocketiin.