2016-04-01 17 views
1

Ich habe eine Reporting-App, und ich erzeuge mongodb Befehle, und es beinhaltet drei Aggregatanrufe ausgeführt werden. Die Sammelaufrufe haben [match, group, project] in ihren Pipes.

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

Die Gruppierung „_id“ für diese Anrufe sind gleich, aber, weil ihre $ passen unterschiedlich sind sie nicht in der gleichen Aggregat Anruf sein kann. Ich muss allen diesen Aggregationsergebnissen beitreten. Ich weiß, dass ein Weg, dies zu lösen, die Verwendung von Bedingungen während der $ Gruppenphase ist, aber das Problem ist, dass die Bedingungen sehr kompliziert sind, um mit der bereits komplexen $ group pipe zu mischen.

Um einen Zusammenhang zu geben, warum diese Lösung sehr schwierig, wenn nicht unmöglich ist; Die Daten sind ziemlich groß, jedes Dokument hat 700 Attribute und die Dokumente kommen auf etwa 1k pro Tag. Das Erzeugen solch komplizierter Bedingungen in jedem Feld in der Stufe $ group wird ein Durcheinander verursachen.

Ich habe Antworten gesehen, die Map-Reduce ausführen, um diese Aggregationsergebnisse zu kombinieren, aber ich suche nach anderen Lösungen. Wie ich untersucht habe, hat Aggregat eine $ out-Pipe. Gibt es eine Möglichkeit, dass ich diese $ out-Pipe manipulieren kann, um diesen Aggregationsergebnissen beizutreten? (Der Grund für das Nachdenken über $ out ist, dass ich ALLE Ergebnisse trotzdem als Bericht speichern muss)

+0

Okay, '$ out' überschreibt immer eine Sammlung, und was Sie im Grunde tun müssen, ist Cursor iterieren und entweder zu einer anderen Sammlung per Cursor Iteration ausgeben oder tun, was Sie tun müssen. Und dieses Detail fehlt in der Frage vollständig. Vergiss die großen Gruselzahlen, da sie nicht relevant sind. Beschreiben Sie stattdessen das eigentliche Problem mit grundlegenden Dokumentbeispielen und einem gewünschten Ergebnis. –

Antwort

0

Wenn Sie tatsächlich die Aggregationsergebnisse zusammenführen möchten, können Sie eine Ausgabesammlung mit Bulk-Upserts erstellen. Für die Leistung können Sie einen zusammengesetzten Index für diese Ausgabesammlung mit den Gruppierungsattributen erstellen.

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

Hier Ihre dataArray erstellt Auf der $out Sammlungen verwenden.

+0

Grundsätzlich auf den richtigen Ansatz, aber es braucht Kontext. Menschen verwenden die mongodb-Shell nicht zum Bereitstellen von Anwendungen. Es gibt sprachspezifische und andere Teile der Frage, die besser geklärt worden wären. Das ist also "zu breit" und kann nicht alle Probleme ansprechen, die in der Frage nicht erläutert werden. –

+0

versuchte, einen Hinweis zu geben, wie man es macht.Sicher wird Ihre Rückmeldung berücksichtigen, während Sie antworten. Danke dafür. – hyades

+1

Ich stimme zu, dass es wahrscheinlich der richtige Ansatz ist. Aber die Frage des OP ist für eine bestimmte Behauptung zu weit. –