2015-04-30 5 views
2

В совокупности у меня есть group -clause:Добавить нормальную строку или Integer

 { $group: { 
       _id: { town_id: "$_id.town" }, 
       houses_data: { $push: 

        { house_id: "$_id.house_id", 
         price: { 
          $divide: ["$sum", "$total"] 
          } 
         } 
       } 
      } 
     } 

Как это Everthing работает отлично

Но тогда я пытался добавить дополнительное поле description в houses_data:

{ house_id: "$_id.house_id", 
     price: { 
     $divide: ["$sum", "$total"] 
     }, 
     description: "thats a house" 
    } 

Сейчас я получаю сообщение об ошибке:

FieldPath '2' doesn't start with $" 

Но Описание не поле.
Я хочу добавить описание как статическое значение строки. Итак, в каждом house_data -array должно быть такое же описание.

Вывод должен выглядеть следующим образом:

{town_id: 13, houses_data: [ 
    {house_id: 5, price: 32, description: "thats a house"}, 
    {house_id: 2, price: 12, description: "thats a house"} 
    ] 
} 

Что я не так? Благодаря!

ответ

4

Используйте $literal оператор, в вашей статье group, как:

{.. description: {$literal:"thats a house"} ..} 

FieldPath '2' doesn't start with $

указывает на то, что значение обрабатывается как expression. Оператор $literal сообщает mongoDB - чтобы не разобрать контент как expression.

Returns a value without parsing. Use for values that the aggregation pipeline may interpret as an expression.

Примечание: Это синтаксис для оператора на $group стадии, выглядит следующим образом:

{ $group: { _id: <expression>, 
      <field1>: { <accumulator1> : <expression1> }, ... } } 

$literal не является одним из accumulators и не могут быть использованы вместо аккумулятора, но потребности чтобы быть частью expression.

2

$literal - это то, что вы ищете. Однако я не считаю, что это действительно для группового этапа aggregation. Я только что попробовал и не мог заставить его работать.

Так вместо этого я хотел бы предложить добавить в поле описания до операции группы трубопровода, а затем сохранить его на групповом этапе, используя выражение: $first

{ $project: { 
       _id: 1, 
       sum: 1, 
       total: 1, 
       description: { $literal: "thats a house" } 
       } 
}, 
{ $group: { 
      _id: { town_id: "$_id.town" }, 
      houses_data: { $push: 

       { house_id: "$_id.house_id", 
        price: { 
         $divide: ["$sum", "$total"] 
         }, 
        description: { $first: "$description" } 
        } 
      } 
     } 
    } 

Я проверил что-то похоже, и это работает ,

+1

Совершенно правильно использовать '$ literal' в предложении group. Он просто должен быть заключен в один из операторов '$ group', таких как' $ push'. – BatScream

+1

Я этого не осознавал. Спасибо за исправление. Если вы добавите это в свой пример, я был бы более чем счастлив, чтобы проголосовать за него как лучший ответ, поскольку он прояснит для всех. – nomDePlum

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