Dimulai dengan MongoDB versi 3.0, cukup mengubah urutan dari
collection.aggregate(...).explain()
untuk
collection.explain().aggregate(...)
akan memberi Anda hasil yang diinginkan (dokumentasi di sini ).
Untuk versi yang lebih lama> = 2.6, Anda perlu menggunakan explain
opsi untuk operasi pipeline agregasi
explain:true
db.collection.aggregate([
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{ $group: {
_id : "$_id",
count: { $sum:1 }
}},
{$sort: {"count":-1}}
],
{
explain:true
}
)
Satu pertimbangan penting dengan Kerangka Agregasi adalah bahwa indeks hanya dapat digunakan untuk mengambil data awal untuk pipa (misalnya penggunaan $match
, $sort
, $geonear
pada awal pipa) serta berikutnya $lookup
dan $graphLookup
tahap. Setelah data telah diambil ke dalam pipa agregasi untuk pengolahan (misalnya melewati tahap seperti $project
, $unwind
, dan $group
) manipulasi lebih lanjut akan di-memori (mungkin menggunakan file-file sementara jika allowDiskUse
pilihan adalah set).
Mengoptimalkan pipeline
Secara umum, Anda dapat mengoptimalkan pipeline agregasi dengan:
- Memulai pipeline dengan
$match
tahapan untuk membatasi pemrosesan pada dokumen yang relevan.
- Memastikan
$match
/ $sort
tahapan awal didukung oleh indeks yang efisien .
- Memfilter data awal menggunakan
$match
, $limit
dan $skip
.
- Meminimalkan tahapan yang tidak perlu dan manipulasi dokumen (mungkin mempertimbangkan kembali skema Anda jika diperlukan senam agregasi yang rumit).
- Memanfaatkan operator agregasi yang lebih baru jika Anda telah meningkatkan server MongoDB Anda. Misalnya, MongoDB 3.4 menambahkan banyak tahapan dan ekspresi agregasi baru termasuk dukungan untuk bekerja dengan array, string, dan faset.
Ada juga sejumlah Pengoptimalan Pipa Agregasi yang otomatis terjadi bergantung pada versi server MongoDB Anda. Misalnya, tahapan yang berdekatan dapat digabungkan dan / atau diatur ulang untuk meningkatkan eksekusi tanpa mempengaruhi hasil keluaran.
Batasan
Seperti di MongoDB 3.4, explain
opsi Kerangka Kerja Agregasi memberikan informasi tentang bagaimana pipeline diproses tetapi tidak mendukung tingkat detail yang sama seperti executionStats
mode untuk find()
kueri. Jika Anda berfokus pada pengoptimalan eksekusi kueri awal, Anda mungkin akan merasa bermanfaat untuk meninjau find().explain()
kueri yang setara dengan executionStats
atau allPlansExecution
verbositas .
Ada beberapa permintaan fitur yang relevan untuk diperhatikan / disukai di pelacak masalah MongoDB mengenai statistik eksekusi yang lebih mendetail untuk membantu mengoptimalkan / alur agregasi profil:
$sort
objek harus berada di dalam array pipeline?explain
batasan Kerangka Agregasi serta permintaan fitur yang relevan untuk statistik eksekusi tambahan.Dimulai dengan versi 2.6.x mongodb memungkinkan pengguna untuk melakukan penjelasan dengan kerangka agregasi .
Yang perlu Anda lakukan adalah menambahkan penjelasan: benar
Berkat Rafa, saya tahu bahwa itu mungkin dilakukan bahkan di 2.4, tetapi hanya melalui
runCommand()
. Tapi sekarang Anda juga bisa menggunakan agregat.sumber
db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})
sejak MongoDB 2.2.Kerangka agregasi adalah seperangkat alat analitik di dalamnya
MongoDB
yang memungkinkan kami menjalankan berbagai jenis laporan atau analisis pada dokumen dalam satu atau lebih koleksi. Berdasarkan ide pipa. Kami mengambil masukan dariMongoDB
koleksi dan meneruskan dokumen dari koleksi tersebut melalui satu atau beberapa tahapan, yang masing-masing melakukan operasi berbeda pada masukannya. Setiap tahapan mengambil masukan apapun tahapan sebelum itu diproduksi sebagai keluaran. Dan input dan output untuk semua tahapan adalah aliran dokumen. Setiap tahap memiliki pekerjaan tertentu yang dilakukannya. Ini mengharapkan bentuk dokumen tertentu dan menghasilkan keluaran tertentu, yang merupakan aliran dokumen. Di akhir pipeline, kami mendapatkan akses ke output.Tahap individu adalah unit pemrosesan data. Setiap tahap mengambil aliran dokumen sebagai masukan satu per satu, memproses setiap dokumen satu per satu dan menghasilkan aliran keluaran dokumen. Sekali lagi, satu per satu. Setiap tahap menyediakan satu set kenop atau merdu yang dapat kita kontrol untuk membuat parameter panggung untuk melakukan tugas apa pun yang ingin kita lakukan. Jadi dekor melakukan tugas umum - tugas bertujuan umum dari beberapa jenis dan membuat parameter dekor untuk kumpulan dokumen tertentu yang sedang kita kerjakan. Dan apa yang kami ingin tahap itu lakukan dengan dokumen-dokumen itu. Tunables ini biasanya mengambil bentuk operator yang dapat kami suplai yang akan memodifikasi bidang, melakukan operasi aritmatika, membentuk kembali dokumen atau melakukan semacam tugas akumulasi serta berbagai hal lainnya. Seringkali, kami '
mis. Kami mungkin ingin melakukan filter awal sehingga kami tidak harus meneruskan seluruh koleksi ke dalam pipeline kami. Namun, kemudian, setelah beberapa pemrosesan tambahan, ingin memfilter sekali lagi menggunakan serangkaian kriteria yang berbeda. Jadi, untuk rekap, pipeline bekerja dengan
MongoDB
koleksi. Mereka terdiri dari tahapan, yang masing-masing melakukan tugas pemrosesan data yang berbeda pada masukannya dan menghasilkan dokumen sebagai keluaran untuk diteruskan ke tahap berikutnya. Dan akhirnya pada akhir keluaran pipa dihasilkan bahwa kita kemudian dapat melakukan sesuatu dalam aplikasi kita. Dalam banyak kasus, perlu menyertakan jenis tahapan yang sama, beberapa kali dalam satu pipeline.sumber