2017-12-28 18 views
0

私は、コレクション内のすべてのプロパティに対して集計パイプライン演算子を適用する必要があるシナリオがあります。ここで私はどのようにそれを達成しました。mongodbでコレクション全体の集約パイプライン演算子を適用する方法

model = { 
     age: Number , 
     risk: Number, 
     retireage: Number, 
     wealth: Number 
    }; 

私は一括して平均を取る必要があります。私が何をしたか

$group :{ 
      _id: '', 
      age : {$avg : {$sum: ['$age',value]}}, 
      risk : {$avg : {$sum: ['$risk',value]}}, 
      retireage : {$avg : {$sum: ['$retireage',value]}}, 
      wealth : {$avg : {$sum: ['$wealth',value]}}, 

    } 

は私がコレクション内のすべてのプロパティに対して一度に{$avg: {$sum:'$this'}}を適用することができる方法があります。

+0

は、平均化する必要があるすべてのプロパティがわからないという問題ですか?または、それらの多くがあるだけで、あなたはそれぞれのように同様の見た目をタイプしたくないのですか? –

+0

なぜ$ sumと$ avgが必要ですか? 1つの数字の平均をとっているだけですから、あなたが計算しようとしていることを英語で説明できますか? –

+0

あなたの2番目のコメントに答えるために投稿を編集しました。最初のコメントのために - はい私はすべてのプロパティを知っていますが、それは20以上のプロパティを持っていますので、結果を得るために20行を書きたくありません。また、$ truncもやる必要があります。 $ truncは$ groupの中ではサポートされていないので、$ projectの中に別の20行を書く必要があります。だから私は、それぞれのプロパティごとに別々に適用されるステートメントを書く方法があるのだろうかと思います。 –

答えて

1

あなたはすべての文書の値を蓄積するnull_id値を指定して、各フィールドの合計を取得するために$sum演算子を使用する必要があります。

Model.aggregate([ 
    { 
     $group : 
     { 
      _id: null, 
      age: { $avg: { $sum: '$age' } }, 
      risk: { $avg: { $sum: '$risk' } }, 
      retireage: { $avg: { $sum: '$retireage' } }, 
      wealth: { $avg: { $sum: '$wealth' } } 
     } 
    } 
]); 

EDITを使用すると、複数のフィールドを持っている場合はグループにあなたがループを使用してクエリを作成することができます。

var fields = ['age', 'risk', 'retireage', 'wealth', ...]; 
    groups = { _id: null }; 

fields.foreach(function (field) { 
    groups[field] = { $avg: { $sum: '$' + field } }; 
}); 

Model.aggregate([ 
    { 
     $group : groups 
    } 
]); 
+0

結果は、この{ _id: ''、 年齢:avegAge、 リスク:avgRisk、 retireage:avgRetireage、 富:avgWealth、 は}のようにする必要があり、各プロパティ –

+0

この '{ を必要とするため、平均取得する必要があります_id: '' 空の文字列 ' 年齢:avegAge、 リスク:avgRisk、 retireage:avgRetireage、 富avgWealth、 } ' –

+0

私は私の答えを更新し、見 – YouneL

関連する問題