使用聚合进行数据压缩

时间:2016-06-08 06:39:57

标签: mongodb aggregation-framework

这是我早期问题的后续行动。我有一个名为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个文档。我想要显示所有这些文件。

任何人都有任何想法?

1 个答案:

答案 0 :(得分: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"}})

关键是要弄清楚如何在Projection中有效地使用这些条件语句。显然,我只需要5个流水线。