2014-07-30 3 views
1

Учитывая следующий запрос, какой лучший способ использовать $$ priceToInflationRatio, чтобы помочь создать несколько вычисленных полей? Из того, что я прочитал в $ let, похоже, работает только для создания одного поля - я бы хотел использовать переменные во всей моей секции $ project. Это возможно?MongoDB Совокупная переменная для создания нескольких полей?

db.books.aggregate([ 
    {$project: { 
     'priceInflationresult': { 
      $let: { 
       vars: { 
        'priceToInflationRatio': { 
         $multiply: [{'$divide': [{'$subtract': ['$price', 1]}, 5]}, 10] 
      } 
     }, 
     in: { 
      '$cond': [ 
      {'$gt': ['$price', 5]}, 
      {'$mod': ['$$priceToInflationRatio', 1]}, 
      1 
      ] 
     }, 
     } 
    } 
    }} 
]) 

ответ

1

in часть выражения $let является объектом, так что он может принимать несколько ключей, каждый из которых может быть выражение, которое вычисляется с переменными в области видимости:

> db.test.insert({ "_id" : 0, "a" : 1, "b" : 1 }) 
> db.test.aggregate([{ 
    "$project" : { 
     "test" : { 
      "$let" : { 
       "vars" : { 
        "c" : 2, 
        "d" : 3 
       }, 
       "in": { 
        "a" : { "$add" : ["$a", "$$c"] }, 
        "b" : { "$add" : ["$b", "$$d"] } 
       } 
      } 
     } 
    } 
}]); 
{ "_id" : 0, "test" : { "a" : 3, "b" : 4 } } 

Заметим, что это обязательно создаст поддокументы, поскольку выражения верхнего уровня $ let не допускаются. Вы можете изменить это на другой этап проекта.

+0

Спасибо за ваш пример. Я использовал несколько этапов проекта, чтобы обойти это пока. Хотелось иметь верхний уровень $ let, или что-то подобное. Также интересно рассмотреть решение поддокумента, я об этом не думал. Таким образом, я мог бы ссылаться на недавно созданный суб-документ в последующем $ let. Являются ли несколько $ let или $ проектов примерно эквивалентными по производительности, или есть преимущество для одного над другим? –

+1

Я не мог сказать, насколько это важно. Оба должны быть быстрыми. Лучшее руководство должно быть вашим собственным тестом, но я предполагаю, что разница достаточно мала, чтобы использовать любой способ, который вам легче поддерживать, может быть лучше. – wdberkeley

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