Mongodb Toplama çerçevesi için açıklama


118

MongoDB'de Toplama çerçevesi için bir açıklama işlevi var mı? Belgelerde göremiyorum.

Kontrol etmenin başka bir yolu yoksa, toplama çerçevesi içinde bir sorgunun nasıl performans gösterdiğini?

Biliyorum bul seni sadece yap

db.collection.find().explain()

Ancak toplama çerçevesi ile bir hata alıyorum

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()

Yanıtlar:


172

MongoDB 3.0 sürümünden başlayarak, sırayı

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

için

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

size istenen sonuçları verecektir (dokümantasyon burada ).

Eski sürümler> = 2.6 için, toplama işlem hattı işlemleri seçeneğini kullanmanız gerekecektir.explain

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

Toplama Framework ile önemli bir husus bir dizin sadece bir boru hattı için ilk veri getirmek için kullanılabilecek olmasıdır (ör kullanımını $match, $sort, $geonearbir boru hattının başında) yanı sıra daha sonraki $lookupve $graphLookupevreleri. Veri işlemek için toplama boru hattına getirilen olmuştur (örn gibi aşamalardan geçerek kez $project, $unwindve $group) ileri manipülasyon bellek (eğer muhtemelen geçici dosyaları kullanıyor olacak allowDiskUseopsiyon kümesidir).

Ardışık düzenleri optimize etme

Genel olarak, toplama işlem hatlarını şu şekilde optimize edebilirsiniz:

  • İşlemeyi $matchilgili belgelerle sınırlamak için bir aşamayla bir boru hattının başlatılması.
  • Başlangıç $match/ $sortaşamaların verimli bir endeks ile desteklenmesini sağlamak .
  • Filtreleme veri erken kullanarak $match, $limitve $skip.
  • Gereksiz aşamaları ve belge manipülasyonunu en aza indirmek (karmaşık toplama jimnastiği gerekliyse belki de şemanızı yeniden gözden geçirmek).
  • MongoDB sunucunuzu yükselttiyseniz daha yeni toplama operatörlerinden yararlanın. Örneğin, MongoDB 3.4 , diziler, dizeler ve yüzlerle çalışma desteği dahil olmak üzere birçok yeni toplama aşaması ve ifade ekledi .

MongoDB sunucu sürümünüze bağlı olarak otomatik olarak gerçekleşen bir dizi Toplama Ardışık Düzeni Optimizasyonu da vardır. Örneğin, çıktı sonuçlarını etkilemeden yürütmeyi iyileştirmek için bitişik aşamalar birleştirilebilir ve / veya yeniden düzenlenebilir.

Sınırlamalar

MongoDB 3.4'te olduğu gibi, Toplama Çerçevesi explainseçeneği, bir ardışık düzeneğin nasıl işlendiği hakkında bilgi sağlar, ancak executionStatsbir find()sorgu moduyla aynı ayrıntı düzeyini desteklemez . İlk sorgu yürütmeyi optimize etmeye odaklandıysanız, eşdeğer find().explain()sorguyu ayrıntıyla executionStatsveya allPlansExecutionayrıntıyla gözden geçirmenin büyük olasılıkla yararlı olduğunu göreceksiniz .

MongoDB sorun izleyicisinde, / profil toplama işlem hatlarını optimize etmeye yardımcı olacak daha ayrıntılı yürütme istatistikleriyle ilgili olarak izlemek / oy vermek için birkaç ilgili özellik isteği vardır:


Bilgi için teşekkürler, herhangi bir değişiklik yapıp yapamayacağımı göreceğim.
SCB

$sortNesne boru hattı dizisinin içinde olmamalı mı ?
JohnnyHK

@JohnnyHK: Evet. Bazı tür insanlar yanıtı yanlış "düzeltiyor" :).
Stennie

Ancak bu "yürütme
İstatistiklerini

1
@KanagaveluSugumar Yanıtı, Toplama Çerçevesi explainsınırlamaları ve ek yürütme istatistikleri için ilgili özellik talepleriyle ilgili açıklamalarla güncelledim .
Stennie

29

2.6.x sürümünden başlayarak mongodb, kullanıcıların toplama çerçevesi ile açıklama yapmasına olanak tanır .

Yapmanız gereken tek şey açıklama eklemek: doğru

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

Rafa sayesinde 2.4'te bile yapmanın mümkün olduğunu biliyorum, ama sadece aracılığıyla runCommand(). Ama artık agregayı da kullanabilirsiniz.


5
Aslında, agregaları db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})MongoDB 2.2'den beri açıklayabilirsiniz .
Rafa

1
Haklısın, 2.2 ve 2.4'te toplamaları yalnızca runCommand aracılığıyla açıklayabilirsin. Olumlu oy için teşekkürler.
Rafa

3
Seçenek 2.6'dan önce runCommand aracılığıyla teknik olarak mevcut olsa da, doğru sonuçların üretilmesi garanti edilmez ve savunulmamalıdır. Bunu gerçekten yalnızca 2.5.3 veya daha yeni sürümlerde kullanmalısınız (ve 2.6 üretim sürümünden önce hala bazı hataların gizlenebileceğini ummalısınız).
Stennie

20

Toplama çerçevesi

Toplama çerçevesi, bir MongoDBveya daha fazla koleksiyondaki belgeler üzerinde çeşitli türlerde raporlar veya analizler çalıştırmamıza olanak tanıyan bir dizi analitik araçtır . Bir boru hattı fikrine dayanarak. Bir MongoDBkoleksiyondan girdi alıyoruz ve bu koleksiyondaki belgeleri, her biri kendi girdileri üzerinde farklı bir işlem gerçekleştiren bir veya daha fazla aşamadan geçiriyoruz. Her aşama, üretilmesinden önceki aşama çıktı olarak girdi olarak alır. Ve tüm aşamalar için girdiler ve çıktılar bir belge akışıdır. Her aşamanın yaptığı belirli bir işi vardır. Belirli bir belge biçimi bekliyor ve kendisi de bir belge akışı olan belirli bir çıktı üretiyor. Boru hattının sonunda çıktıya erişiyoruz.

toplama çerçeve aşaması

Tek bir aşama, bir veri işleme birimidir. Her aşama, girdi olarak birer birer belge akışı alır, her belgeyi birer birer işler ve belgelerin çıktı akışını üretir. Yine, birer birer. Her aşama, yapmak istediğimiz görevi gerçekleştirmek için aşamayı parametreleştirmek için kontrol edebileceğimiz bir dizi düğme veya ayar sağlar. Yani bir aşama genel bir görevi yerine getirir - bir tür genel amaçlı görev ve birlikte çalıştığımız belirli belge kümesinin aşamasını parametreleştirir. Ve bu aşamada bu belgelerle tam olarak ne yapmasını istiyoruz Bu ayarlanabilirler tipik olarak, alanları değiştirecek, aritmetik işlemler gerçekleştirecek, belgeleri yeniden şekillendirecek veya bir tür biriktirme görevi ve diğer şeylerin doğrulamasını yapacak operatörler biçimini alır. Çoğu zaman, biz '

tek bir ardışık düzen içinde birden çok kez aynı tür aşama

Örneğin, tüm koleksiyonu ardışık düzenimize geçirmek zorunda kalmamak için bir ilk filtre uygulamak isteyebiliriz. Ancak daha sonra, bazı ek işlemlerin ardından, farklı bir ölçüt kümesi kullanarak bir kez daha filtrelemek isteyebilirsiniz. Özetlemek gerekirse, pipeline bir MongoDBkoleksiyonla çalışır . Her biri kendi girdisi üzerinde farklı bir veri işleme görevi yapan ve bir sonraki aşamaya geçirilmek üzere çıktı olarak belgeler üreten aşamalardan oluşurlar. Ve son olarak, üretim hattının sonunda, uygulamamız içinde bir şeyler yapabileceğimiz çıktı üretilir. Çoğu durumda, tek bir ardışık düzen içinde birden çok kez aynı tür aşamayı dahil etmek gerekir.


teşekkürler, daha iyi bir anlayışa sahip olmak faydalı oldu.
Arun Pratap Singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.