Mongo 聚合 - 使用在 $project 中创建的变量

Mar*_*arc 5 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]}
        }
    }]
Run Code Online (Sandbox Code Playgroud)

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

有什么方法可以轻松有效地做到这一点吗?我想过做几个预测,但每次我需要计算一个额外的变量时,我都需要投影许多变量(~25 个变量),而且我有一堆变量要计算,它们相互依赖(~5 个变量),并且我的代码可能看起来很糟糕,因为会有很多相同变量的投影。我应该怎么做?

Joh*_*yHK 2

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

pipeline = [{   
    '$match': {}
},
{
    '$group': {
        '_id': '$_id',
        'n': {'$first': 'n'}
},
{
    '$project': {
        'name': 1,
        'n': 1,
        'revenue': {'$multiply': ['$n', 2]},
        'cost': {'$multiply': [{'$multiply': ['$n', 2]}, 0.25]}
    }
}]
Run Code Online (Sandbox Code Playgroud)

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

pipeline = [{   
    '$match': {}
},
{
    '$group': {
        '_id': '$_id',
        'n': {'$first': 'n'}
},
{
    '$project': {
        'name': 1,
        'n': 1,
        'revenue': {'$multiply': ['$n', 2]},
        'cost': {'$multiply': ['$n', 2, 0.25]}
    }
}]
Run Code Online (Sandbox Code Playgroud)