// 0. Pridajte ChovatelstvoDB z web stranky a zoznamte sa s jej strukturou // 1. Spocitajte vsetky zeny. use ChovatelstvoDB db.Chovatel.countDocuments({ pohlavie: "F" }); // skuste to iste pomocou aggregate funkcie db.Chovatel.aggregate([ { $match: {pohlavie: "F"} }, { $group: { //_id je, ze podla coho sa groupuje _id: null, // netreba groupovat uz podla nicoho, lebo kazdy dokument vyhovujuci zhode bude mat hodnotu 1 ktoru budeme sumovat // pocet: { $sum: 1 } } } ]); // AGGREGATION PIPELINE // 2. Vypiste priemernu vysku ludi podla pohlavia pomocou agregacie. db.Chovatel.aggregate([ { $group: { // _id : "$nazovAtributuPreGroupBy" _id: '$pohlavie', // hocico : {$agregacnyOperator: "$nazovInehoAtributuZKtorehoBeriemeJehoHodnotuAleboTuViemeDatAjKonkretnuHodnotuAkoVPredoslomPriklade"} priemernaVyska: { $avg: '$vyska' } } } ]); // 3. Vypiste priemernu vysku vsetkych dospelych podla pohlavia. var pred18rokmi = new Date(); pred18rokmi.setFullYear(pred18rokmi.getFullYear() - 18); pred18rokmi; db.Chovatel.aggregate([ { $match: { datumNarodenia: { $lte: pred18rokmi } } }, // v prvom kroku chcem odfiltrovat pomocou match { $group: { _id: '$pohlavie', sumarnaVyska: { $avg: '$vyska' } } } // v druhom kroku uz robim gorup ]); //da sa to robit aj opacne, najprv group a potom match // 4. Vypiste pocet, sumarnu aj priemernu vysku vsetkych dospelych podla pohlavia. db.Chovatel.aggregate([ { $match: { datumNarodenia: { $lte: pred18rokmi } } }, { $group: { _id: '$pohlavie', pocet: { $sum: 1 }, // s pretypovanim na int, inak pocita desatinne sumarnaVyska: { $sum: '$vyska' }, priemernaVyska: { $avg: '$vyska' } } } ]); // 5. Vypiste priemernu vysku ludi podla pohlavia paradigmom map-reduce. // otvorit normalny mongoshell use ChovatelstvoDB map = function () { //emit(this.nazovAtributuPreGroupBy, this.nazovInehoAtributu) emit(this.pohlavie, this.vyska); // Funkcia emit rozdeli kolekciu podla pohlavia a vrati polia vysiek, // kde v jednom poli budu vysky zien a v druhom poli budu vysky muzov } //reduce(nazovAtributuPreGroupBy, poleObjektov) // Funkcia reduce bude zavolana pre kazde pole vysiek vytvoreneho z emit. // T.j. najprv sa zavola reduce('F', poleVysiekZien) a nasledne reduce('M', poleVysiekMuzov) reduce = function (pohlavie, vysky) { var suma = 0.0 for (i = 0; i < vysky.length; i++) { suma += vysky[i] } return suma / vysky.length; // Skratene vieme pouzit funkciu Array.avg, ktora vrati aritmeticky priemer pola. //return Array.avg(vysky); } // Nasledne zavolame na kolekcii funkciu mapReduce, ktora dostane funkcie map, reduce // a pomenovanie naseho vysledku {out: 'vysledok'}. // mapReduce vrati novu kolekciu, na ktoru sa vieme hned dopytovat cez find() db.Chovatel.mapReduce(map, reduce, { out: 'vysledok1' })//ulozi sa do tabulky vysledok db.vysledok1.find(); // 6. Vypiste priemernu vysku vsetkych dospelych podla pohlavia paradigmom map-reduce. // najprv sa spusti podla parametru query odfiltorvanie dospelych, az potom map a reduce db.Chovatel.mapReduce(map, reduce, { query: { datumNarodenia: { $lte: pred18rokmi } }, out: 'vysledok2' }) db.vysledok2.find(); // Ine riesenie mapDospeli = function () { pred18 = new Date(); pred18.setFullYear(pred18.getFullYear() - 18); if (this.datumNarodenia <= pred18) { emit(this.pohlavie, this.vyska); } } db.Chovatel.mapReduce(mapDospeli, reduce, { out: 'vysledok' }).find(); // 7. Vytvorte kolekciu s 50000 dokumentami obsahujucimi atribut meno. use Garaz db.Auto.drop() // i7 6700K s 32GB RAM zvladne 50000. // Na slabsich PC treba dat menej, inak to failne. for (i = 0; i < 25000; i++) { db.Auto.insertOne({ meno: "Audi A" + i }) } // RYCHLY ZAPIS aut // var auta = [] // for (i = 0; i < 25000; i++) { // auta.push({ meno: "Audi A" + i }) // } // db.Auto.insertMany(auta) // 8. Zmerajte cas dopytu na nejake meno. db.Auto.find({ meno: "Audi A15000" }).explain("executionStats") db.Auto.find({ meno: "Audi A15000" }).explain("executionStats").executionStats.executionTimeMillis // 9. Vytvorte na atribute meno index a znova zmerajte cas dopytu na nejake meno. // Ascending index db.Auto.createIndex({ meno: 1 }) db.Auto.find({ meno: "Audi A15000" }).explain("executionStats").executionStats.executionTimeMillis // Descending index // db.Garaz.Auto.createIndex({meno: -1}) db.Auto.dropIndex({ meno: 1 }) db.Auto.find({ meno: "Audi A15000" }).explain("executionStats").executionStats.executionTimeMillis