在同一个MongoDB查询中获取多个数组的计数

时间:2014-01-17 08:52:28

标签: mongodb

如果我有以下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

谢谢: - )

1 个答案:

答案 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语句中,我包含了作为第一个语句输出一部分的匹配数!

这是输出:

The output

希望这有帮助!