2016-04-01 15 views
1

私は報告アプリを持っていますが、私はmongodbコマンドを生成し、3つの集約呼び出しを実行します。集約コールにはパイプ内に[match、group、project]があります。彼らの$の試合は、彼らが同じ集計呼び出しにすることはできません異なっているため、これらの呼び出しのための

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

グループ「_id」は、同じですが、。これらの集計結果のすべてに参加する必要があります。これを解決する方法の1つは$ groupステージで条件を使用することですが、問題は条件が複雑な$ groupパイプと混在することです。

不可能ではないにしても、その解決策がなぜ非常に難しいのかを説明します。データは非常に巨大であり、各ドキュメントには700の属性があり、ドキュメントは1日あたり約1kで表示されます。このような複雑な条件を$ groupステージの各フィールドに生成すると、混乱が生じます。

これらの集計結果を結合するためにmap-reduceを実行している回答がありましたが、私は他の解決策を探しています。私が研究したように、集計には$ outパイプがあります。これらの集計結果を結合するために$ outパイプを操作できる方法はありますか? (なぜなら、$ outを考える理由は、結果としてすべての結果をレポートとして保存する必要があるからです)

+0

さて、 '$ out'は常にコレクションを上書きします。基本的には、カーソルを反復し、カーソルの繰り返しごとに別のコレクションに出力するか、何をする必要があるかを行う必要があります。それは、その質問から完全に欠けているその細部です。関係のない大きな怖い数字は忘れてしまいます。実際の問題を、基本的な文書の例と望ましい結果で記述してください。 –

答えて

0

実際に集計結果をマージする場合は、バルクアップサートを使用して出力コレクションを作成できます。パフォーマンスのために、この出力コレクションに複合インデックスを作成することができます。複合インデックスはグループ化属性を持ちます。ここで

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

あなたdataArray$outコレクションに検索を使用して作成されます。

+0

基本的には正しいアプローチですが、文脈が必要です。人々はmongodbシェルを使用してアプリケーションを配備しません。問題の言語特有の部分や他の部分が明確になっているはずです。だから、これは実際には、質問に説明されていないすべての問題に対処することができないという点で、アスカーを「広すぎる」ものです。 –

+0

これを行う方法にヒントを与えようとしていました。回答中にあなたのフィードバックを考慮に入れています。ありがとう。 – hyades

+1

私はそれがおそらく正しいアプローチだと "同意する"。しかし、OPの質問は、特定の主張のために広がる方法です。 –

関連する問題