2016-04-01 9 views
1

Bir raporlama uygulamasına sahibim ve mongodb komutları oluşturuyorum ve üç toplu çağrı çalıştırmayı içeriyor. Toplu çağrılar borularına [eşleme, grup, proje] sahiptir. Onların $ maçı aynı agrega çağrısında olamaz farklı olduğu için bu aramalar için

RESULT OF AGGREGATE 1-3 
{_id: <XXX>, ...} 

gruplama "_ID", aynıdır, ancak. Tüm bu toplama sonuçlarına katılmam gerekiyor. Bunu çözmenin bir yolunun $ group aşamasında koşulları kullanması olduğunu biliyorum, ancak sorun şu ki, zaten karmaşık olan $ grup borusuyla karışmak için şartlar gerçekten karmaşıktır. Imkansız olmasa bile bu çözümün neden çok zor olduğu konusunda biraz bağlam sağlamak için; veriler oldukça büyük, her bir dokümanın 700 özelliği var ve dokümanlar günde 1k civarında geliyor. $ Grup aşamasında böyle karmaşık bir durumun EACH alanına dönüştürülmesi karışıklık yaratacaktır.

Bu toplama sonuçlarını birleştirmek için harita küçültme çalıştıran yanıtları gördüm ancak diğer çözümleri arıyorum. Araştırdığım gibi, toplamda bir çıkış borusu var. Bu toplama sonuçlarına katılmak için $ out borusunu manipüle etmenin herhangi bir yolu var mı? ($ Out düşüncesinin nedeni TÜM sonuçları bir rapor olarak kaydetmem gerekmesidir)

+0

Tamam, "dışarıda" her zaman bir koleksiyonun üzerine yazar ve temelde yapmanız gereken şey yineleme imleçleri ve imleç yinelemesi başına başka bir koleksiyona çıktı ya da yapmanız gereken her şeyi yapar. Ve bu sorudan tamamen eksik olan detay. Önemli olmayan büyük sayıları unutun. Bunun yerine, asıl problemi temel belge örnekleri ve istenen bir sonuç ile açıklayın. –

cevap

0

Birleştirme sonuçlarının birleştirilmesi için gerçekten devam etmek istiyorsanız, toplu yüklemeler kullanarak bir çıktı koleksiyonu oluşturabilirsiniz. Performans için, grup çıkış özelliklerine sahip olan bu çıktı koleksiyonunda bir bileşik dizin oluşturabilirsiniz. İşte

dataArray.map(function(data) { 
    data.forEach(function(err, row){ 
     var setOnInsert = {grouping_attrs: row.grouping_values, v1: row.v1} 
     var set = {v2: row.v2} 
     var query = {grouping_attrs: row.grouping_values} 
     bulk.find(query).upsert().update({$setOnInsert: setOnInsertStmt, $set: set}); 
    })  
}) 

senin $out koleksiyonları find kullanılarak dataArray oluşturulur.

+0

Temel olarak doğru yaklaşımda, ancak içeriğe ihtiyacı var. İnsanlar uygulamaları dağıtmak için mongodb kabuğunu kullanmazlar. Sorunun daha iyi açıklığa kavuşacağı dile özgü ve diğer bölümleri vardır. Yani bu, aslında “çok geniş” bir sorundur ki, bu soruda açıklanmayan tüm meseleleri ele alamaz. –

+0

Nasıl yapılacağına dair ipucu vermeye çalışıyordum. Cevap verirken geri bildiriminizi dikkate alacaktır. Bunun için teşekkürler. – hyades

+1

Muhtemelen doğru yaklaşımın "katılıyorum". Ancak OP'nin sorusu, belirli bir iddia için geniş bir yoldur. –