Mongo Aggregation - 使用$ project中创建的变量

时间:2013-12-17 16:10:30

标签: python mongodb pymongo aggregation-framework

是否可以在同一阶段使用$ project阶段中定义的变量? 例如,我有这个聚合管道:

    pipeline = [{   
        '$match': {}
    },
    {
        '$group': {
            '_id': '$_id',
            'n': {'$first': 'n'}
    },
    {
        '$project': {
            'name': 1,
            'n': 1,
            'revenue': {'$multiply': ['$n', 2]},
            'cost': {'$multiply': ['$revenue', 0.25]}
        }
    }]

我想在同一个$ project阶段使用$ revenue变量(我在$ project中定义)来计算cost的值,但这不起作用。

有什么方法可以轻松高效地完成这项工作吗?我想过做几个预测但是每次我需要计算一个额外的变量时我需要投射很多变量(~25个变量),并且我有一堆变量来计算彼此依赖的变量(~5个变量),而且我的代码可能看起来很糟糕,因为会有很多相同变量的投影。我应该怎么做呢?

2 个答案:

答案 0 :(得分:1)

不,但您可以将投影运算符嵌套为解决方法:

pipeline = [{   
    '$match': {}
},
{
    '$group': {
        '_id': '$_id',
        'n': {'$first': 'n'}
},
{
    '$project': {
        'name': 1,
        'n': 1,
        'revenue': {'$multiply': ['$n', 2]},
        'cost': {'$multiply': [{'$multiply': ['$n', 2]}, 0.25]}
    }
}]

在这种情况下,您可以简化为:

pipeline = [{   
    '$match': {}
},
{
    '$group': {
        '_id': '$_id',
        'n': {'$first': 'n'}
},
{
    '$project': {
        'name': 1,
        'n': 1,
        'revenue': {'$multiply': ['$n', 2]},
        'cost': {'$multiply': ['$n', 2, 0.25]}
    }
}]

答案 1 :(得分:1)

刚刚在搜索相同问题时登陆这里。我当前的解决方案是添加更多 $project 阶段并始终采用所有其他字段。对于您的示例,它看起来像这样:

pipeline = [{   
    '$match': {}
},
{
    '$group': {
        '_id': '$_id',
        'n': {'$first': 'n'}
},
{
    '$project': {
        'name': 1,
        'n': 1,
        'revenue': {'$multiply': ['$n', 2]}
    }
},
{
    '$project': {
        'name': 1,
        'n': 1,
        'revenue': 1,
        'cost': {'$multiply': ['$revenue', 0.25]}
    }
}]

如果您想保留所有以前的计算字段,而不需要多次重复使用表达式,我还没有找到更好的解决方案。