Mongodb Jelaskan untuk kerangka Agregasi

118

Apakah ada fungsi menjelaskan untuk kerangka Agregasi di MongoDB? Saya tidak bisa melihatnya di dokumentasi.

Jika tidak, apakah ada cara lain untuk memeriksa, bagaimana kinerja kueri dalam kerangka agregasi?

Saya tahu dengan menemukan Anda lakukan saja

db.collection.find().explain()

Tetapi dengan kerangka agregasi saya mendapatkan kesalahan

db.collection.aggregate(
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { 
        $group: 
        { 
            _id : { id: "$_id"},
            "count": { $sum:1 } 
        }
    },
    { $sort: {"count":-1}}
).explain()
SCB
sumber

Jawaban:

172

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:

Stennie
sumber
Terima kasih atas infonya, kami akan melihat apakah saya dapat melakukan perubahan.
SCB
Bukankah $sortobjek harus berada di dalam array pipeline?
JohnnyHK
@JohnnyHK: Ya. Beberapa orang baik hati salah "mengoreksi" jawaban :).
Stennie
Tapi ini tidak memberikan "executionStats"
Kanagavelu Sugumar
1
@KanagaveluSugumar Saya telah memperbarui jawaban dengan klarifikasi tentang explainbatasan Kerangka Agregasi serta permintaan fitur yang relevan untuk statistik eksekusi tambahan.
Stennie
29

Dimulai dengan versi 2.6.x mongodb memungkinkan pengguna untuk melakukan penjelasan dengan kerangka agregasi .

Yang perlu Anda lakukan adalah menambahkan penjelasan: benar

db.records.aggregate(
  [ ...your pipeline...],
  { explain: true }
)

Berkat Rafa, saya tahu bahwa itu mungkin dilakukan bahkan di 2.4, tetapi hanya melalui runCommand(). Tapi sekarang Anda juga bisa menggunakan agregat.

Salvador Dali
sumber
5
Sebenarnya, Anda dapat menjelaskan agregat dengan db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})sejak MongoDB 2.2.
Rafa
1
Anda benar, di 2.2 dan 2.4 Anda hanya dapat menjelaskan agregat melalui runCommand. Terima kasih atas upvote-nya.
Rafa
3
Meskipun opsi secara teknis ada melalui runCommand sebelum 2.6, itu tidak dijamin untuk menghasilkan hasil yang benar dan tidak dianjurkan. Anda seharusnya hanya menggunakan ini di 2.5.3 atau yang lebih baru (dan berharap mungkin masih ada beberapa bug yang bersembunyi sebelum rilis produksi 2.6).
Stennie
20

Kerangka Agregasi

Kerangka agregasi adalah seperangkat alat analitik di dalamnya MongoDByang memungkinkan kami menjalankan berbagai jenis laporan atau analisis pada dokumen dalam satu atau lebih koleksi. Berdasarkan ide pipa. Kami mengambil masukan dari MongoDBkoleksi 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 kerangka agregasi

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 '

jenis panggung yang sama beberapa kali dalam satu pipa

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 MongoDBkoleksi. 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.

Zameer
sumber
terima kasih, sangat membantu untuk mendapatkan pemahaman yang lebih baik.
Arun Pratap Singh