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: