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 explainopsi 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, $geonearpada awal pipa) serta berikutnya $lookupdan $graphLookuptahap. 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 allowDiskUsepilihan adalah set).
Mengoptimalkan pipeline
Secara umum, Anda dapat mengoptimalkan pipeline agregasi dengan:
- Memulai pipeline dengan
$matchtahapan untuk membatasi pemrosesan pada dokumen yang relevan.
- Memastikan
$match/ $sorttahapan awal didukung oleh indeks yang efisien .
- Memfilter data awal menggunakan
$match, $limitdan $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, explainopsi Kerangka Kerja Agregasi memberikan informasi tentang bagaimana pipeline diproses tetapi tidak mendukung tingkat detail yang sama seperti executionStatsmode untuk find()kueri. Jika Anda berfokus pada pengoptimalan eksekusi kueri awal, Anda mungkin akan merasa bermanfaat untuk meninjau find().explain()kueri yang setara dengan executionStatsatau allPlansExecutionverbositas .
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: