2016-06-08 76 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个管道。