1

我有几个需要汇总的数字字段。假设我的文档结构如下:

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

如果我想使用其中一个数字字段将计算字段添加到我的管道中,我可以执行以下操作:

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

如果我想添加基于其中两个字段的计算字段,我知道我可以这样做:

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']}

你可以嵌套操作符,所以第二种情况是:

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 回答