如果我有以下players
集合:
> db.players.findOne()
{
_id: 1,
goals: ['goal_a', 'goal_b', 'goal_c'],
matches: ['match_a', 'match_b', 'match_c', 'match_d']
}
MongoDB中是否可以编写一个查询,该查询将返回每个Array
的计数,例如_id: 1
:
{
_id: 1, num_goals: 3, num_matches: 4
}
到目前为止,我已经能够使用aggregation pipeline获得Array
的一个的计数:
> db.players.aggregate(
{ $match: { '_id': 1 } },
{ $unwind: '$goals' },
{ $group: { _id:'player', num_goals: {$sum:1} } }
)
是否可以扩展此概念以计算同一查询中的多个Array
?
谢谢: - )
答案 0 :(得分:2)
你的问题引起了我的兴趣!我决定玩一下,这是有可能的!尽管如此仍然有点棘手。
使用多个$ groups和$ unwinds,您可以重新整理管道中的文档并使用它来获得所需的输出!我测试的查询 - 与您的文档结构一起使用 - 如下:
> db.players.aggregate(
{$match:{"_id":1}},
{$unwind: "$matches"},
{$group:{_id:"$_id",num_matches :{$sum:1},goals:{$first:"$goals"}}},
{$unwind:"$goals"},
{$group:{"_id":"$_id",num_matches:{$first:"$num_matches"},num_goals:{$sum:1}}}
)
它的作用是重复你已经发现过两次的步骤,因为我们正在处理两个带有简单加法的数组。在第二个$ group语句中,我包含了作为第一个语句输出一部分的匹配数!
这是输出:
希望这有帮助!