MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mongodb Jelaskan untuk kerangka Agregasi

Dimulai dengan MongoDB versi 3.0, cukup ubah urutannya dari

collection.aggregate(...).explain()

untuk

collection.explain().aggregate(...)

akan memberi Anda hasil yang diinginkan (dokumentasi di sini).

Untuk versi 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
  }
)

Pertimbangan penting dengan Kerangka Agregasi adalah bahwa indeks hanya dapat digunakan untuk mengambil data awal untuk saluran (misalnya penggunaan $match , $sort , $geonear di awal pipeline) serta $lookup subsequent berikutnya dan $graphLookup tahapan. Setelah data diambil ke dalam alur agregasi untuk diproses (mis. melewati tahapan seperti $project , $unwind , dan $group ) manipulasi lebih lanjut akan berada di dalam memori (mungkin menggunakan file sementara jika allowDiskUse opsi disetel).

Mengoptimalkan pipeline

Secara umum, Anda dapat mengoptimalkan pipeline agregasi dengan:

  • Memulai pipeline dengan $match tahap untuk membatasi pemrosesan ke dokumen yang relevan.
  • Memastikan $match awal / $sort tahapan didukung oleh indeks yang efisien.
  • Memfilter data lebih 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 secara otomatis terjadi tergantung pada versi server MongoDB Anda. Misalnya, tahapan yang berdekatan dapat digabungkan dan/atau disusun ulang untuk meningkatkan eksekusi tanpa mempengaruhi hasil keluaran.

Batasan

Seperti pada MongoDB 3.4, Kerangka Agregasi explain option memberikan informasi tentang bagaimana pipeline diproses tetapi tidak mendukung tingkat detail yang sama dengan executionStats mode untuk find() pertanyaan. Jika Anda berfokus pada pengoptimalan eksekusi kueri awal, kemungkinan besar akan bermanfaat untuk meninjau find().explain() yang setara kueri dengan executionStats atau allPlansExecution verbositas.

Ada beberapa permintaan fitur yang relevan untuk diperhatikan/di-upvote di pelacak masalah MongoDB mengenai statistik eksekusi yang lebih mendetail untuk membantu mengoptimalkan/memprofilkan alur agregasi:

  • SERVER-19758:Tambahkan mode penjelasan "executionStats" dan "allPlansExecution" ke penjelasan agregasi
  • SERVER-21784:Lacak statistik eksekusi untuk setiap tahap alur agregasi dan paparkan melalui penjelasan
  • SERVER-22622:Tingkatkan penjelasan $lookup untuk menunjukkan rencana kueri pada koleksi "dari"


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara mengimplementasikan has_many :melalui hubungan dengan Mongoid dan mongodb?

  2. String Koneksi di MongoDB (dengan contoh)

  3. Desain skema database MongoDB

  4. NodeJS dan MongoDB FindAndModify() perlu dihapus atau diperbarui

  5. Cara Menginstal MongoDB 4.2 pada sistem RedHat/ CentOS 7