Mongodb聚合多层次

时间:2016-12-12 16:16:06

标签: mongodb aggregation-framework

我正在尝试计算包含的文档   {日期,方向,程序}例如   {'12月12日','西','上'}

我希望输出:foreach date,foreach direction,count each procedure type

[ { date: "Mmm dd",
    direction:  { procedure: count, procedure: count },
    direction:  { procedure: count, ... },
       ....
   }

  { ... }

  ...
]

使用javascript相当容易,但如果可能的话我想使用mongodb。我不能让聚合组过滤多个级别,我不确定map_reduce是否有帮助。我也没理解。

我很感激一点指导。感谢

一些细节:   这是一个无模式的集合,但有趣的部分看起来像这样:

[ { date: "Dec 12",
    "West": { "Arrive": 5, "Depart": 5 },
    "East": { "Arrive": 1, "Depart": 7 },
    ...
  },
  { date: ...},
  ...
]
  • 方向:“北”| “东”| “南”| “西方”
  • 程序:“到达”| “出发”
  • 日期:“Mmm dd”

  • ....很多其他的东西

输出并不重要 - 可能是:

org.quartz

e.g:

quartz

我玩的越多,我认为它就越有吸引力 - 这可能是一个很好的建议: - )

1 个答案:

答案 0 :(得分:1)

这是您的汇总管道的解决方案:

[{
    '$group': {
        '_id': {
            'date': '$date',
            'direction': '$direction',
            'procedure': '$procedure'
        },
        'count': {'$sum': 1}
    }
},
{
    '$group': {
        '_id': '$_id.date',
        'directions': {
            '$push': {
                'direction': '$_id.direction',
                'procedure': '$_id.procedure',
                'count': '$count'
            }
        }
    }
}]

给出以下结果:

{
    _id: "Dec 12",
    directions: [
        { "direction": "North", "procedure": "Arrive", "count": 5},
        { "direction": "North", "procedure": "Depar", "count": 3},
        { "direction": "South", "procedure": "Arrive", "count": 1},
        ...
    ]
},
...

说明

基本上你要求的是每个(date, direction, procedure)元组的计数。你只是希望它有点重组,更确切地说:按日期分组,每个日期所有可能的(direction, procedure)对,以及相应的计数。

所以我们正是这样做的:

  • 管道组中的第一个$group阶段由唯一(date, direction, procedure)组成,将它们放入_id字段,并计算出现的次数;在这个阶段输出是:

    [{     _ID: {         日期:“12月12日”,         方向:“北方”,         程序:“Depar”     },     数:4 }, ... ]

  • 第二个$group阶段只是按日期重新对结果进行分组,将其他字段(嵌入在_id字段中的文档中,作为上一阶段的结果)推送到数组中在新的directions字段中,(direction, procedure, count)元组具有相同的日期。