我看了几个类似的问题/答案,例如this one,但我无法解决我的问题。
我有一个名为output
的集合,其中包含
{
"_id" : ObjectId("55e06ac3cd8a52ac141012f2"),
"Date" : ISODate("2010-11-02T00:00:00Z"),
"output" : 0,
"region" : "Gotham"
}
这些文档跨越多年和地区,我试图运行一个聚合来获得每个地区每年总产出的细分。如果我忽略这一年,我可以使用这个
获得第一部分output.aggregate(
[
{ "$group": {
"_id": { region: "$region"},
"output": { "$sum": "$output" }
}}
],
function(err,results) {
console.log(results);
db.close();
}
);
给了我
[ { _id: { region: 'Gotham' }, output: 2115715 },
{ _id: { region: 'London' }, output: 6799038 },
{ _id: { region: 'Tokyo' }, output: 8744809 }
但这里的产量是几年,我希望它每年分解。
我尝试了以下但是它没有工作
output.aggregate(
[
{
$project : {
year: {
$year: "$Date"
}
}
},
{
"$group": {
"_id": {
region: "$region",
year: ""$year
},
"output": { "$sum": "$output" }
}
}
],
function(err,results) {
console.log(results);
db.close();
}
);
这导致
[ { _id: { year: 2015 }, output: 0 },
{ _id: { year: 2014 }, output: 0 },
{ _id: { year: 2013 }, output: 0 },
{ _id: { year: 2012 }, output: 0 },
{ _id: { year: 2009 }, output: 0 },
{ _id: { year: 2008 }, output: 0 },
{ _id: { year: 2011 }, output: 0 },
{ _id: { year: 2010 }, output: 0 } ]
答案 0 :(得分:2)
核心聚合错误。
当您使用$project
之类的管道运算符时,进入下一个管道阶段的仅值仅 您明确指定的值。所以你的问题是你在$group
中引用文档中不再存在的字段,因为你“省略了它们”。
因此在$project
之后你没有提到“region”,那么该字段不再在下一个管道阶段要处理的文档中,这将导致问题。
基本修正是“包含它们”,但实际上,只需在$group
中直接使用运算符,因为它更有效:
output.aggregate(
[
{
"$group": {
"_id": {
"region": "$region",
"year": { "$year": "$Date" }
},
"output": { "$sum": "$output" }
}
}
],
function(err,results) {
console.log(results);
db.close();
}
);
已经完成了
认为“unix pipe”是这样的:
ps aux | grep mongo | grep something
如果你已经过滤掉了“mongo”,那么除非你在结果中有“mongo something”,否则不再有任何“东西”可以匹配了。这是“管道”的基本原则。