1

集計する必要がある数値フィールドがいくつかあります。私の文書が次のように構成されているとしましょう:

_id: 1234,
numValue1: 10,
numValue2: 20,
numValue3: 30,
numValue4: 40

数値フィールドの 1 つを使用して計算フィールドをパイプラインに追加したい場合は、次のようにすることができます。

db.myCollection.aggregate(
{ 
  $project : {
    someComputedField : { $add:["$numValue1", 15] }
  }
})

これらのフィールドのうちの 2 つに基づいて計算フィールドを追加したい場合は、次のようにすることができます。

db.myCollection.aggregate(
{ 
  $project : {
    someComputedField : { $add:["$numValue1", "$numValue2"] }
  }
})

さて、私の質問は、$numValue1 + $numValue2 + $numValue3 + $numValue4 を実行する必要がある場合はどうすればよいでしょうか?

またはさらに興味深いことに、$numValue1 * ($numValue2 + $numValue3) / $numValue4?

4

2 に答える 2

5

$add複数の値を受け入れることができるため、最初のケースは次のようになります。

someComputedField: {$add: ['$numValue1', '$numValue2', '$numValue3', '$numValue4']}

また、演算子をネストできるため、2 番目のケースは次のようになります。

someComputedField: {
    $divide: [
        {$multiply: [
            '$numValue1', {$add: ['$numValue2', '$numValue3']}
        ]},
        '$numValue4'
    ]
}
于 2012-12-14T15:27:07.543 に答える
-1

クエリが単純な追加ではない場合は、map/reduceを使用することをお勧めします。

db.myCollection.mapReduce(function() {
   emit('result', this.numValue1 * (this.numValue2 + this.numValue3) / this.numValue4);
}, function(key, values) {
   var i=0; values.forEach(function(n){i+=n;}); return i;
});

また、集約フレームワークとmap/reduceのパフォーマンスはほぼ同じです。

于 2012-12-14T15:29:20.687 に答える