2013-12-17 5 views
3

Можно ли использовать переменные, определенные на фазе $ project на этой же фазе? Например, у меня есть агрегация трубопровода:

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

Я хотел бы использовать переменную $ дохода (который я определил в $ проектируемая) в одной и той же фазе $ проекта для вычисления значения стоимости, но это не работает.

Есть ли способ, которым я могу сделать это легко и эффективно? Я думал о нескольких проекциях, но мне нужно было спроектировать много переменных (~ 25 переменных) каждый раз, когда мне нужно вычислить одну дополнительную переменную, и у меня есть куча переменных для вычисления, которые зависят друг от друга (~ 5 переменных), и мой код, вероятно, выглядел бы плохо, поскольку было бы много проецирования одних и тех же переменных. Как мне это сделать?

ответ

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]} 
    } 
}] 
+0

справа, но каждая переменная несколько строк кода и у меня было бы много вложенных переменных внутри каждого вычисления. Мне нужно было бы каждый раз, когда мне нужно было его вычислять, вычислять переменные, что не имело бы смысла, если бы у меня было 5 переменных, зависящих друг от друга, где я должен использовать каждую переменную около 5 раз в каждом вычислении. Но спасибо за предложение! – Marc

Смежные вопросы