这是我早期问题的后续行动。我有一个名为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个文档。我想要显示所有这些文件。
任何人都有任何想法?
答案 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个流水线。