用于算术运算的MongoDB聚合 - 子文档字段

时间:2015-05-04 14:37:40

标签: node.js mongodb mongoose aggregation-framework

我们有一个聚合查询,可以预测几个子文档。我们想在这些预测值上应用Sum和Product等几个算术运算。

汇总查询 -

invalid operator '$sum'

这给出了一个错误说明 original_y

我们应该怎样做才能在new_y中获得$project{ id:1, original_y: 200, new_y: 140, dummy: [ {id:1, storage:2, cost: 10}, {id:2, storage:0, cost: 20}, {id:3, storage:5, cost: 30}, ] } 的总和?

修改

文件:

 {
     id:1,
     original_y: 200,
     new_y: 140,
     dummy: [
      {id:1, storage:2, cost: 10, tallyAmount: 34},
      {id:3, storage:5, cost: 30, tallyAmount: 11.33},
      ]
    }

输出预期:

tallyAmount = (original_y + new_y) / cost

其中,        private static function get_defaults() { $defauls = array( 'title' => '' , 'subtitle' => '' , 'columns' => '4' , 'ntax' => '' , 'showposts' => '12' , 'imagesize' => 'medium' , 'posttype' => '' , 'exclude' => '' , 'terms' => '' , 'border' => '' , 'padding' => '' ); return $defaults; } /** * Generates the administration form for the widget. * * @param array instance The array of keys and values for the widget. */ public function form( $instance ) { $instance = wp_parse_args( (array)$instance,self::get_defaults() );

错误:无法为虚拟子字段添加表达式,因为已存在适用于整个字段的表达式

1 个答案:

答案 0 :(得分:5)

如果没有文档架构的详细信息和预期的聚合结果,我建议您尝试以下聚合,因为我认为您需要$add运算符而不是$sum运算符。请注意,$sum运算符仅适用于$group运算符。使用$add运算符,它将两个数字/字段相加,并将结果存储在$project运算符的新字段中:

Item.aggregate([
    { "$match": { "dummy.storage": { "$gt": 0 } } },
    { "$unwind": "$dummy" },   
    { "$group": { 
        "_id": "$_id", 
        "original_y": { "$first": "$original_y" },
        "new_y": { "$first": "$new_y" }
    } },
    { "$project": {
        "original_y": 1, 
        "new_y": 1,
        "tallyAmount": { "$add": [ "$new_y", "$original_y" ] }
    } }
]).exec(callback);

- 更新 -

要满足条件tallyAmount = (original_y + new_y) / cost,您应该在$ project运算符管道阶段使用$add$divide算术运算符,这样您的最终聚合管道将如下所示:

Item.aggregate([
    { "$match": { "dummy.storage": { "$gt": 0 } } },
    { "$unwind": "$dummy" },
    {
        "$project": {
            "original_y": 1, 
            "new_y": 1,
            "dummy.id": "$dummy.id",
            "dummy.storage": "$dummy.storage",
            "dummy.cost": "$dummy.cost",
            "dummy.tallyAmount": {
                "$divide": [
                    { "$add": ["$new_y","$original_y"] },
                    "$dummy.cost"
                ]
            }
        }
    },
    {
        "$group": {
            "_id": "_$id",
            "original_y": { "$first": "$original_y" },
            "new_y": { "$first": "$new_y" },
            "dummy": {
                "$addToSet": "$dummy"
            }
        }        
    }
 ]).exec(callback);