按字段分组并在最大日期汇总

时间:2016-02-03 19:03:14

标签: mongodb aggregation-framework

我有mongo类型的文档 -

{
    "_id" : ObjectId("77f02ee61df85c423b6a4e79"),
    "client" : "1"
    "type" : "type1",
    "hierarchy" : "hier1",
    "creationDate" : ISODate("2015-09-09T13:06:44Z"),
    "model" : "m1"
},
{
    "_id" : ObjectId("77f02ee61df85c423b6a4e80"),
    "client" : "1"
    "type" : "type1",
    "hierarchy" : "hier1",
    "creationDate" : ISODate("2015-09-10T14:06:44Z"),
    "model" : "m2"
},
{
    "_id" : ObjectId("77f02ee61df85c423b6a4e81"),
    "client" : "1"
    "type" : "type1",
    "hierarchy" : "hier2",
    "creationDate" : ISODate("2015-09-10T13:06:44Z"),
    "model" : "m3"
},
{
    "_id" : ObjectId("77f02ee61df85c423b6a4e82"),
    "client" : "2"
    "type" : "type2",
    "hierarchy" : "hier2",
    "creationDate" : ISODate("2015-09-10T14:06:44Z"),
    "model" : "m4"
}

我想回答查询 - 对于给定的client,请为每个creationDatetype组合(类型+层次结构)获取所有最新(hierarchy)个文档)。

例如。 client = 1的上述数据集的输出看起来像

 {
    "_id" : ObjectId("77f02ee61df85c423b6a4e80"),
    "client" : "1"
    "type" : "type1",
    "hierarchy" : "hier1",
    "creationDate" : ISODate("2015-09-10T14:06:44Z"),
    "model" : "m2"
},
{
    "_id" : ObjectId("77f02ee61df85c423b6a4e81"),
    "client" : "1"
    "type" : "type1",
    "hierarchy" : "hier2",
    "creationDate" : ISODate("2015-09-10T13:06:44Z"),
    "model" : "m3"
}

我尝试使用给定的流/管道创建查询 -

  1. Match client = 1(聚合内$match)的文档。
  2. group by“list”和“hierarchy”(聚合内的$group)。
  3. 我想通过最新的creationDate字段汇总上一步中的文档组。我实际上希望每个组中包含最新($sum, $avg etc)字段的文档,而不是应用聚合函数creationDate
  4. 但是我被困在流程中的第3点。我不知道如何使用相同的typehierarchy汇总文档,并为单个creationDate中的每种类型和层次结构选择具有最新日期(mongo)的文档查询。

1 个答案:

答案 0 :(得分:3)

利用$first阶段内的$group运算符。然后,如果有必要,请包括$project阶段。使用$$ROOT变量将整个字段保存在名为record的变量下。

示例代码:

db.t.aggregate([
{$match:{"client":"1"}},
{$sort:{"creationDate":-1}},
{$group:{"_id":{"type":"$type",
                "hierarchy":"$hierarchy"},
          "record":{$first:"$$ROOT"}}}
])

添加如下所示的$project阶段,将文档字段放在顶层,没有必要,可以在客户端轻松处理。

{$project:{"_id":0,"client":"$record.client","model":"$record.model",..}}