【发布时间】:2013-05-19 10:27:53
【问题描述】:
鉴于此 MongoDB 集合:
[
{ character: 'broquaint', race: 'Halfling', class: 'Hunter' },
{ character: 'broquaint', race: 'Halfling', class: 'Hunter' },
{ character: 'broquaint', race: 'Halfling', class: 'Rogue' },
{ character: 'broquaint', race: 'Naga', class: 'Fighter' },
{ character: 'broquaint', race: 'Naga', class: 'Hunter' }
]
我想计算每个种族和班级的数量,即
{
race: { 'Halfling': 3, 'Naga': 2 },
class: { 'Hunter': 3, 'Rogue': 1, 'Fighter': 1 }
}
我一直在尝试使用聚合框架来做到这一点(到 替换现有的地图/减少),但只能达到 作为组合计数,即
{ '_id': { race: 'Halfling', class: 'Hunter' }, count: 2 }
{ '_id': { race: 'Halfling', class: 'Rogue' } count: 1 }
{ '_id': { race: 'Naga', class: 'Fighter' }, count: 1 }
{ '_id': { race: 'Naga', class: 'Hunter' }, count: 1 }
这很简单,可以以编程方式减少到所需的 结果,但我希望能够将其留给 MongoDB。
参考这里是我到目前为止的代码:
db.games.aggregate(
{ '$match': { character: 'broquaint' } },
{
'$group': {
_id: { race: '$race', background: '$background'},
count: { '$sum': 1 }
}
}
)
所以问题是 - 鉴于示例集合我可以到达我的 完全通过 MongoDB 的聚合框架获得所需的输出?
对于任何可能提供的帮助,提前非常感谢!
【问题讨论】:
-
什么是“$background”?上课?
-
抱歉,代码中它应该读作“class”而不是“background”,列名实际上是“background”,但为简洁起见,我选择了“class”,但一致性失败了。
标签: mongodb aggregation-framework