我正在尝试计算包含的文档 {日期,方向,程序}例如 {'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
我玩的越多,我认为它就越有吸引力 - 这可能是一个很好的建议: - )
答案 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)
元组具有相同的日期。