具有多个密钥的MongoDB聚合

时间:2015-09-09 13:44:10

标签: mongodb aggregation-framework

我看了几个类似的问题/答案,例如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 } ]

1 个答案:

答案 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”,否则不再有任何“东西”可以匹配了。这是“管道”的基本原则。