2015-04-30 57 views
2

在總我有一個group -clause:添加正常字符串或整數

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

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

像這種寄託都工作正常

但後來我試圖在houses_data添加額外的場description

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

現在,我得到一個錯誤:

FieldPath '2' doesn't start with $" 

但是說明不是字段。
我想將說明添加爲靜態字符串值。 所以在每個house_data-陣列中,應該有相同的描述。

輸出應該像這樣:

{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

在group子句中使用'$ literal'是完全正確的。它只需要被'$ push'之類的'$ group'操作符所包圍。 – BatScream

+1

我沒有意識到這一點。感謝您的更正。如果你把這一點加到你的例子中,我會非常樂意投票,因爲它可以爲所有人澄清更好的答案。 – nomDePlum