Saat Anda mulai bekerja dengan MongoDB, biasanya Anda akan menggunakan perintah use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])4 untuk berbagai kueri. Namun, segera setelah kueri Anda semakin maju, Anda perlu mengetahui lebih banyak tentang agregasi MongoDB
Pada artikel ini, saya akan menjelaskan prinsip utama membangun kueri agregat di MongoDB dan cara memanfaatkan indeks untuk mempercepatnya
Selanjutnya, saya akan memperkenalkan tahapan paling penting dari pipa agregasi dengan contoh singkat menggunakan masing-masing, dan bagaimana menerapkannya ke pipa
Agregasi adalah cara memproses sejumlah besar dokumen dalam koleksi dengan cara melewatkannya melalui tahapan yang berbeda. Tahapan membentuk apa yang dikenal sebagai pipa. Tahapan dalam pipeline dapat memfilter, mengurutkan, mengelompokkan, membentuk ulang, dan memodifikasi dokumen yang melewati pipeline
Salah satu kasus penggunaan Agregasi yang paling umum adalah menghitung nilai agregat untuk grup dokumen. Ini mirip dengan agregasi dasar yang tersedia di SQL dengan klausa GROUP BY dan fungsi COUNT, SUM dan AVG. Agregasi MongoDB melangkah lebih jauh dan juga dapat melakukan gabungan seperti relasional, membentuk ulang dokumen, membuat koleksi baru dan memperbarui yang ada, dan seterusnya.
Meskipun ada metode lain untuk mendapatkan data agregat di MongoDB, kerangka kerja agregasi adalah pendekatan yang direkomendasikan untuk sebagian besar pekerjaan
Ada yang disebut metode tujuan tunggal seperti use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])5, use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])6, dan use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])7 yang ditambahkan ke kueri use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])4 sehingga cepat digunakan tetapi cakupannya terbatas
Kerangka pengurangan peta pada MongoDB adalah pendahulu kerangka agregasi dan jauh lebih kompleks untuk digunakan. MongoDB sudah tidak digunakan lagi
Berikut adalah diagram untuk mengilustrasikan pipa agregasi MongoDB yang khas
- Tahap use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])_9 – menyaring dokumen-dokumen yang perlu kita kerjakan, yang sesuai dengan kebutuhan kita
- { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_0 tahap – melakukan pekerjaan agregasi
- { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 tahap – mengurutkan dokumen yang dihasilkan sesuai kebutuhan (naik atau turun)
Input dari pipeline dapat berupa satu kumpulan, di mana yang lain dapat digabungkan nanti di pipeline
Pipeline kemudian melakukan transformasi berturut-turut pada data hingga tujuan kami tercapai
Dengan cara ini, kami dapat memecah kueri kompleks menjadi tahapan yang lebih mudah, di mana setiap tahapan kami menyelesaikan operasi berbeda pada data. Jadi, di akhir jalur kueri, kami akan mencapai semua yang kami inginkan
Pendekatan ini memungkinkan kita untuk memeriksa apakah kueri kita berfungsi dengan baik di setiap tahap dengan memeriksa input dan outputnya. Keluaran dari setiap tahap akan menjadi masukan bagi tahap berikutnya
Alat seperti Studio 3T memungkinkan Anda membuat kueri agregasi
Unduh Studio 3T Gratis untuk Mac, Windows, atau Linux
Tidak ada batasan jumlah tahapan yang digunakan dalam kueri, atau cara kami menggabungkannya
Untuk mencapai kinerja kueri yang optimal, ada sejumlah praktik terbaik yang perlu diperhatikan. Kami akan membahasnya nanti di artikel
Ini adalah contoh cara membuat kueri agregasi
{ university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_2,
- di mana collectionName – adalah nama koleksi,
- pipeline – adalah larik yang berisi tahapan agregasi,
- opsi – parameter opsional untuk agregasi
Ini adalah contoh sintaks pipa agregasi
pipeline = [ { $match : { … } }, { $group : { … } }, { $sort : { … } } ] _Agregasi bekerja di memori. Setiap tahap dapat menggunakan hingga 100 MB RAM. Anda akan mendapatkan error dari database jika melebihi batas ini
Jika itu menjadi masalah yang tidak dapat dihindari, Anda dapat memilih ke halaman ke disk, dengan satu-satunya kelemahan adalah Anda akan menunggu lebih lama karena lebih lambat bekerja di disk daripada di memori. Untuk memilih metode halaman ke disk, Anda hanya perlu mengatur opsi { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }3 menjadi benar seperti ini
db.collectionName.aggregate(pipeline, { allowDiskUse : true })Perhatikan bahwa opsi ini tidak selalu tersedia untuk layanan bersama. Misalnya cluster Atlas M0, M2 dan M5 menonaktifkan opsi ini
Dokumen yang dikembalikan oleh kueri agregasi, baik sebagai kursor atau disimpan melalui { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }4 di koleksi lain, dibatasi hingga 16 MB. Artinya, mereka tidak boleh lebih besar dari ukuran maksimum dokumen MongoDB
Jika Anda cenderung melebihi batas ini, maka Anda harus menentukan bahwa keluaran kueri agregasi akan berupa kursor dan bukan sebagai dokumen
Saya akan menunjukkan contoh agregat MongoDB untuk tahapan pipeline yang paling penting
Untuk mengilustrasikan contoh, saya akan menggunakan dua koleksi. Yang pertama disebut { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_5 dan terdiri dari dokumen-dokumen ini (datanya tidak nyata)
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }Jika Anda ingin menguji contoh-contoh ini pada instalasi Anda sendiri, Anda dapat memasukkannya dengan perintah massal di bawah, atau
use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])Koleksi kedua dan terakhir disebut { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_6 dan terlihat seperti ini
{ university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_Sekali lagi, Anda dapat menyisipkannya dengan cara yang sama, menggunakan kode berikut atau dengan mengimpornya sebagai file JSON
db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])tempat Anda akan menemukan file JSON yang tersedia untuk diunduh
Tahap use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9 memungkinkan kita untuk memilih hanya dokumen-dokumen dari koleksi yang ingin kita kerjakan. Ini dilakukan dengan memfilter yang tidak mengikuti persyaratan kami
Dalam contoh berikut, kami hanya ingin bekerja dengan dokumen yang menentukan bahwa { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }8 adalah nilai bidang { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }9, dan db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])0 adalah nilai bidang db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])1
Untuk mendapatkan keluaran yang dapat dibaca, saya akan menambahkan db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])2 di akhir semua perintah
db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()Keluarannya adalah…
{ "_id" : ObjectId("5b7d9d9efbc9884f689cdba9"), "country" : "Spain","city" : "Salamanca", "name" : "USAL", "location" : { "type" : "Point", "coordinates" : [ -5.6722512, 17, 40.9607792 ] }, "students" : [ { "year" : 2014, "number" : 24774 }, { "year" : 2015, "number" : 23166 }, { "year" : 2016, "number" : 21913 }, { "year" : 2017, "number" : 21715 } ] } { "_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"), "country" : "Spain", "city" : "Salamanca", "name" : "UPSA", "location" : { "type" : "Point", "coordinates" : [ -5.6691191, 17, 40.9631732 ] }, "students" : [ { "year" : 2014, "number" : 4788 }, { "year" : 2015, "number" : 4821 }, { "year" : 2016, "number" : 6550 }, { "year" : 2017, "number" : 6125 } ] }Jarang Anda perlu mengambil semua bidang dalam dokumen Anda. Merupakan praktik yang baik untuk mengembalikan hanya bidang yang Anda perlukan untuk menghindari pemrosesan lebih banyak data daripada yang diperlukan
Tahap db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])_3 digunakan untuk melakukan ini dan untuk menambahkan bidang kalkulasi yang Anda perlukan
Dalam contoh ini, kita hanya memerlukan field { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }9, db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])1 dan db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])6
Dalam kode berikut, harap perhatikan itu
- Kita harus secara eksplisit menulis db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])_7 ketika bidang ini tidak diperlukan
- Selain bidang db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])_8, cukup untuk menentukan hanya bidang yang perlu kami peroleh sebagai hasil kueri
Tahap ini …
db.universities.aggregate([ { $project : { _id : 0, country : 1, city : 1, name : 1 } } ]).pretty()akan memberikan hasil…
{ "country" : "Spain", "city" : "Salamanca", "name" : "USAL" } { "country" : "Spain", "city" : "Salamanca", "name" : "UPSA" }Ini contoh lain dari proyek $ MongoDB
Dengan tahap { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_0, kita dapat melakukan semua kueri agregasi atau ringkasan yang kita perlukan, seperti menemukan jumlah, total, rata-rata, atau maksimum
Dalam contoh ini, kami ingin mengetahui jumlah dokumen per universitas dalam koleksi 'db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()0' kami
Permintaan …
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_0akan membuahkan hasil ini…
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_1Tahap $group mendukung ekspresi tertentu (operator) yang memungkinkan pengguna untuk melakukan operasi aritmatika, larik, boolean, dan lainnya sebagai bagian dari pipa agregasi
OperatorMeaning$countMenghitung jumlah dokumen dalam grup tertentu. $maxMenampilkan nilai maksimum bidang dokumen dalam koleksi. $minMenampilkan nilai minimum bidang dokumen dalam koleksi. $avgMenampilkan nilai rata-rata bidang dokumen dalam koleksi. $sumMenjumlahkan nilai yang ditentukan dari semua dokumen dalam koleksi. $pushMenambahkan nilai ekstra ke dalam larik dokumen yang dihasilkanLihat untuk melihat operator MongoDB lainnya dan pelajari lebih lanjut tentang topik ini
Ini adalah jenis tahapan yang tidak biasa karena memungkinkan Anda untuk membawa hasil agregasi Anda ke koleksi baru, atau ke koleksi yang sudah ada setelah melepaskannya, atau bahkan menambahkannya ke dokumen yang sudah ada (baru di 4. 1. 2 versi)
Tahap { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }4 harus menjadi tahap terakhir dalam alur
Untuk pertama kalinya, kami menggunakan agregasi dengan lebih dari satu tahap. Kami sekarang memiliki dua, { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_0 dan { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }4
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_2Sekarang, kami memeriksa konten koleksi baru 'db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()4'
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_3Inilah cara kami menggunakan tahap $out dalam contoh tiga bagian ini
Sekarang kami telah menghasilkan agregasi multi-tahap, kami dapat terus membangun saluran pipa
Tahap db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()_5 di MongoDB umumnya ditemukan dalam pipa karena merupakan sarana untuk mencapai tujuan
Anda tidak dapat bekerja secara langsung pada elemen array di dalam dokumen dengan tahapan seperti { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }0. Tahap db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()_5 memungkinkan kita bekerja dengan nilai bidang dalam array
Jika terdapat bidang larik di dalam dokumen masukan, terkadang Anda perlu menampilkan dokumen beberapa kali, satu kali untuk setiap elemen larik tersebut
Setiap salinan dokumen memiliki bidang larik yang diganti dengan elemen yang berurutan
Dalam contoh berikutnya, saya akan menerapkan tahapan hanya pada dokumen yang bidangnya db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])6 berisi nilai db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()9
Ini dokumennya
Sekarang, kami menerapkan tahap db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()_5, di atas larik siswa, dan memeriksa apakah kami mendapatkan dokumen per setiap elemen larik
Dokumen pertama terdiri dari bidang di elemen pertama array dan bidang umum lainnya
Dokumen kedua terdiri dari bidang di elemen kedua dari array dan bidang umum lainnya, dan seterusnya
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_5Anda memerlukan tahapan { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }_1 untuk mengurutkan hasil menurut nilai bidang tertentu
Misalnya, mari kita urutkan dokumen yang diperoleh sebagai hasil dari tahap db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()5 berdasarkan jumlah siswa dalam urutan menurun
Untuk mendapatkan hasil yang lebih sedikit, saya hanya akan memproyeksikan tahun dan jumlah siswa
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_6Ini memberikan hasil…
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_7Tahapan { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 dapat digunakan dengan tahapan lain untuk mengurangi data dalam koleksi MongoDB sesuai kebutuhan Anda
Bagaimana jika Anda hanya tertarik pada dua hasil pertama kueri Anda?
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_8Perhatikan bahwa saat Anda perlu membatasi jumlah dokumen yang diurutkan, Anda harus menggunakan tahap { "_id" : ObjectId("5b7d9d9efbc9884f689cdba9"), "country" : "Spain","city" : "Salamanca", "name" : "USAL", "location" : { "type" : "Point", "coordinates" : [ -5.6722512, 17, 40.9607792 ] }, "students" : [ { "year" : 2014, "number" : 24774 }, { "year" : 2015, "number" : 23166 }, { "year" : 2016, "number" : 21913 }, { "year" : 2017, "number" : 21715 } ] } { "_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"), "country" : "Spain", "city" : "Salamanca", "name" : "UPSA", "location" : { "type" : "Point", "coordinates" : [ -5.6691191, 17, 40.9631732 ] }, "students" : [ { "year" : 2014, "number" : 4788 }, { "year" : 2015, "number" : 4821 }, { "year" : 2016, "number" : 6550 }, { "year" : 2017, "number" : 6125 } ] }4 tepat setelah { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1
Sekarang kami memiliki pipa penuh
Kami dapat menempelkan seluruh kueri agregat MongoDB ini dan semua tahapannya langsung ke
Itu disisipkan dengan menyalinnya dan mengklik tombol tempel kode seperti yang ditunjukkan
Baca selengkapnya tentang Editor Agregasi, pembuat kueri agregasi MongoDB tahap demi tahap dari Studio 3T
Hanya bagian yang ditunjukkan di bawah ini yang disalin dan ditempel
db.collectionName.aggregate(pipeline, { allowDiskUse : true })_9Di tangkapan layar berikutnya, kita bisa melihat saluran lengkap di Studio 3T dan hasilnya
Menghapus tahapan di Studio 3T adalah masalah sederhana menggunakan tombol yang ditunjukkan pada tangkapan layar berikutnya
Editor Agregasi Studio 3T mendukung operator dan tahapan agregasi MongoDB ini
Ada kemungkinan bahwa Anda perlu membuat beberapa perubahan pada output Anda di bidang baru. Pada contoh berikutnya, kami ingin menambahkan tahun berdirinya universitas
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_0Ini memberikan hasil…
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_1Tahap { "_id" : ObjectId("5b7d9d9efbc9884f689cdba9"), "country" : "Spain","city" : "Salamanca", "name" : "USAL", "location" : { "type" : "Point", "coordinates" : [ -5.6722512, 17, 40.9607792 ] }, "students" : [ { "year" : 2014, "number" : 24774 }, { "year" : 2015, "number" : 23166 }, { "year" : 2016, "number" : 21913 }, { "year" : 2017, "number" : 21715 } ] } { "_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"), "country" : "Spain", "city" : "Salamanca", "name" : "UPSA", "location" : { "type" : "Point", "coordinates" : [ -5.6691191, 17, 40.9631732 ] }, "students" : [ { "year" : 2014, "number" : 4788 }, { "year" : 2015, "number" : 4821 }, { "year" : 2016, "number" : 6550 }, { "year" : 2017, "number" : 6125 } ] }_6 menyediakan cara mudah untuk memeriksa jumlah dokumen yang diperoleh dalam output dari tahap pipa sebelumnya
Mari kita lihat aksinya
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_2Ini memberikan total tahun-tahun yang kita ketahui jumlah mahasiswa di Universitas
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_3Karena MongoDB berbasis dokumen, kami dapat membentuk dokumen sesuai kebutuhan. Namun, seringkali ada persyaratan untuk menggunakan informasi dari lebih dari satu koleksi
Menggunakan { "_id" : ObjectId("5b7d9d9efbc9884f689cdba9"), "country" : "Spain","city" : "Salamanca", "name" : "USAL", "location" : { "type" : "Point", "coordinates" : [ -5.6722512, 17, 40.9607792 ] }, "students" : [ { "year" : 2014, "number" : 24774 }, { "year" : 2015, "number" : 23166 }, { "year" : 2016, "number" : 21913 }, { "year" : 2017, "number" : 21715 } ] } { "_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"), "country" : "Spain", "city" : "Salamanca", "name" : "UPSA", "location" : { "type" : "Point", "coordinates" : [ -5.6691191, 17, 40.9631732 ] }, "students" : [ { "year" : 2014, "number" : 4788 }, { "year" : 2015, "number" : 4821 }, { "year" : 2016, "number" : 6550 }, { "year" : 2017, "number" : 6125 } ] }_7, berikut adalah kueri agregat yang menggabungkan bidang dari dua kumpulan
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_4Perlu ________26______7 contoh lain?
Jika Anda ingin kueri ini berjalan cepat, Anda harus mengindeks bidang db.courses.insert([ { university : 'USAL', name : 'Computer Science', level : 'Excellent' }, { university : 'USAL', name : 'Electronics', level : 'Intermediate' }, { university : 'USAL', name : 'Communication', level : 'Excellent' } ])6 di koleksi db.universities.aggregate([ { $match : { country : 'Spain', city : 'Salamanca' } } ]).pretty()0 dan bidang db.universities.aggregate([ { $project : { _id : 0, country : 1, city : 1, name : 1 } } ]).pretty()1 di koleksi db.universities.aggregate([ { $project : { _id : 0, country : 1, city : 1, name : 1 } } ]).pretty()2
Dengan kata lain, jangan lupa mengindeks bidang yang terlibat dalam { "_id" : ObjectId("5b7d9d9efbc9884f689cdba9"), "country" : "Spain","city" : "Salamanca", "name" : "USAL", "location" : { "type" : "Point", "coordinates" : [ -5.6722512, 17, 40.9607792 ] }, "students" : [ { "year" : 2014, "number" : 24774 }, { "year" : 2015, "number" : 23166 }, { "year" : 2016, "number" : 21913 }, { "year" : 2017, "number" : 21715 } ] } { "_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"), "country" : "Spain", "city" : "Salamanca", "name" : "UPSA", "location" : { "type" : "Point", "coordinates" : [ -5.6691191, 17, 40.9631732 ] }, "students" : [ { "year" : 2014, "number" : 4788 }, { "year" : 2015, "number" : 4821 }, { "year" : 2016, "number" : 6550 }, { "year" : 2017, "number" : 6125 } ] }7
Inilah cara tercepat untuk
Tahapan ini merupakan jalan pintas untuk mengelompokkan, menghitung, dan kemudian mengurutkan dalam urutan menurun jumlah nilai yang berbeda dalam suatu bidang
Misalkan Anda ingin mengetahui jumlah kursus per level, diurutkan dalam urutan menurun. Berikut ini adalah kueri yang perlu Anda bangun
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_6Ini adalah output
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_7Terkadang saat membuat laporan tentang data, Anda menemukan bahwa Anda perlu melakukan pemrosesan pendahuluan yang sama untuk sejumlah laporan, dan Anda harus membuat dan memelihara kumpulan perantara
Anda dapat, misalnya, melakukan ringkasan perdagangan mingguan yang digunakan oleh semua laporan berikutnya. Anda mungkin berharap bisa menjalankan lebih dari satu pipeline secara bersamaan melalui output dari satu pipeline agregasi
Kami sekarang dapat melakukannya dalam satu pipa berkat tahap db.universities.aggregate([ { $project : { _id : 0, country : 1, city : 1, name : 1 } } ]).pretty()4
Lihatlah contoh ini
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_8Apa yang telah kami lakukan adalah membuat dua laporan dari database program universitas kami. Menghitung Tingkat dan Tahun Dengan Siswa Lebih Sedikit
Mereka berdua menggunakan keluaran dari dua tahap pertama, use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9 dan { "_id" : ObjectId("5b7d9d9efbc9884f689cdba9"), "country" : "Spain","city" : "Salamanca", "name" : "USAL", "location" : { "type" : "Point", "coordinates" : [ -5.6722512, 17, 40.9607792 ] }, "students" : [ { "year" : 2014, "number" : 24774 }, { "year" : 2015, "number" : 23166 }, { "year" : 2016, "number" : 21913 }, { "year" : 2017, "number" : 21715 } ] } { "_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"), "country" : "Spain", "city" : "Salamanca", "name" : "UPSA", "location" : { "type" : "Point", "coordinates" : [ -5.6691191, 17, 40.9631732 ] }, "students" : [ { "year" : 2014, "number" : 4788 }, { "year" : 2015, "number" : 4821 }, { "year" : 2016, "number" : 6550 }, { "year" : 2017, "number" : 6125 } ] }7
Dengan koleksi yang besar, ini dapat menghemat banyak waktu pemrosesan dengan menghindari pengulangan, dan kita tidak perlu lagi menulis koleksi perantara sementara
{ country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] } { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] }_9Baca selengkapnya tentang kasus penggunaan tahap $facet lainnya dalam agregasi MongoDB
Sekarang, coba selesaikan sendiri latihan berikutnya
Bagaimana kita mendapatkan jumlah siswa yang pernah menjadi milik masing-masing universitas?
use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])0Hasil
use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])_1Ya, saya telah menggabungkan dua tahap. Namun, bagaimana cara membuat kueri yang mengurutkan keluaran berdasarkan bidang db.universities.aggregate([ { $project : { _id : 0, country : 1, city : 1, name : 1 } } ]).pretty()7 dalam urutan menurun?
use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])_2Benar, kita perlu menerapkan tahap db.universities.aggregate([ { $project : { _id : 0, country : 1, city : 1, name : 1 } } ]).pretty()_8 pada keluaran db.universities.aggregate([ { $project : { _id : 0, country : 1, city : 1, name : 1 } } ]).pretty()9
Saya sebutkan sebelumnya bahwa sangat mudah, dan memang penting, untuk memeriksa apakah tahapan kueri kita berjalan seperti yang kita perlukan.
Dengan Studio 3T, Anda memiliki dua panel khusus untuk
Pipa agregasi secara otomatis membentuk ulang kueri dengan tujuan meningkatkan kinerjanya
Jika Anda memiliki tahap { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 dan use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9, selalu lebih baik menggunakan use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9 sebelum { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 untuk meminimalkan jumlah dokumen yang harus ditangani oleh tahap { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1
Untuk memanfaatkan indeks, Anda harus melakukannya di tahap pertama alur Anda. Dan di sini, Anda harus menggunakan tahapan use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])_9 atau { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1
Kami dapat memeriksa apakah kueri menggunakan indeks melalui metode { "country" : "Spain", "city" : "Salamanca", "name" : "USAL" } { "country" : "Spain", "city" : "Salamanca", "name" : "UPSA" }7
use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])_3Anda selalu dapat melihat rencana { "country" : "Spain", "city" : "Salamanca", "name" : "USAL" } { "country" : "Spain", "city" : "Salamanca", "name" : "UPSA" }_7 dari kueri agregasi apa pun sebagai diagram atau dalam JSON dengan mengeklik tab Jelaskan
Saya telah memperkenalkan pipa agregasi MongoDB dan mendemonstrasikan dengan contoh bagaimana menggunakan hanya beberapa tahapan
Semakin banyak Anda menggunakan MongoDB, semakin penting pipa agregasi dalam memungkinkan Anda melakukan semua tugas pelaporan, transformasi, dan kueri lanjutan yang sangat integral dengan pekerjaan pengembang basis data
Dengan proses pipeline yang lebih kompleks, semakin penting untuk memeriksa dan men-debug input dan output dari setiap tahap
Selalu ada titik di mana seseorang perlu menempelkan pipa agregasi yang berkembang ke dalam IDE untuk MongoDB seperti Studio 3T, dengan Editor Agregasi bawaan, sehingga Anda dapat men-debug setiap tahap secara mandiri