2016-06-08 39 views
0

這跟隨我早期的問題。我有一個名爲coln的集合,我在那裏存儲一個名爲costheads的字段,縮寫爲: - mnfc用於製造,sls用於銷售。使用匯總的數據按摩

我的聚合框架應該從這個集合中讀取,並將它聚合在一起,並用它們的實際單詞替換這些縮寫。

請參見下面的代碼: -

db.coln.aggregate(
    {$match: {"year" : "2010","companyName" :/ABC/}}, 
    {$unwind:"$hierarchy"}, 
    {$unwind:"$hierarchy.Details" }, 
    { 
     $group: 
     { "_id": 
      {"companyName": "$companyName", 
      "year": "$year", 
      "costHead": "$hierarchy.originalName"}, 
    "total": { "$sum": "$hierarchy.Details.values" }} 
    }, 
    {$project: {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year", 
     "costHead": { $cond: { if: { $eq: [ "$_id.costHead", "Mnfc"] }, then:   "Manufacturing", else: "$_id.costHead" } }, 
     "Total":"$total" 
    }}, 
    {$project: {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year", 
     "costHead": { $cond: { if: { $eq: [ "$_id.costHead", "Sls"] }, then:   "Sales", else: "$_id.costHead" } }, 
     "Total":"$total" 
    }}) 

這段代碼的問題是,它返回

{} {}

但是,如果我刪除第二個最後投影:(見下文) -

db.coln.aggregate(
    {$match: {"year" : "2010","companyName" :/ABC/}}, 
    {$unwind:"$hierarchy"}, 
    {$unwind:"$hierarchy.Details" }, 
    { 
     $group: 
     { "_id": 
      {"companyName": "$companyName", 
      "year": "$year", 
      "costHead": "$hierarchy.originalName"}, 
    "total": { "$sum": "$hierarchy.Details.values" }} 
    }, 
    {$project: {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year", 
     "costHead": { $cond: { if: { $eq: [ "$_id.costHead", "Mnfc"] }, then:   "Manufacturing", else: "$_id.costHead" } }, 
     "Total":"$total" 
    }}) 

我得到1個文件被返回 - 只有1個文件。 該投影似乎過濾剩餘的文檔。

但是過濾器不是我想要的。這是一個典型的ETL場景,我希望縮寫在將其加載到目標集合之前用其完整格式替換。至少有幾百個需要彙總和轉換的文檔。

如果我應用投影,它會過濾掉其他50個文檔。我希望顯示所有這些文件。

任何人有任何想法?

+4

你能否提供一個示例文檔? –

回答

0

管理弄清楚。查看下面的代碼片段: -

db.coln.aggregate(
{$match: {"year" : "2010","companyName" :/ABC/}}, 
{$unwind:"$hierarchy"}, 
{$unwind:"$hierarchy.Details" }, 
{ 
    $group: 
    { "_id": 
      {"companyName": "$companyName", 
      "year": "$year", 
      "costHead": "$hierarchy.originalName"}, 
    "total": { "$sum": "$hierarchy.Details.values" }} 
}, 
{$project: 
    {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year","costPoint": 
    { $cond: { if: { $eq: [ "$_id.costHead", "Mnfc"] }, 
    then: "Manufacturing", else: 
    { $cond: { if: { $eq: [ "$_id.costHead", "sls"]}, then: "Sales", else: 0}}}},"Total":"$total"}}) 

關鍵是弄清楚如何在投影中有效地使用這些條件語句。所以顯然我只需要5個管道。