【问题标题】:Obtain count of multiple Arrays in same MongoDB query在同一个 MongoDB 查询中获取多个数组的计数
【发布时间】:2014-01-17 18:12:12
【问题描述】:

如果我有以下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 获得 一个 Arrays 的计数:

> db.players.aggregate(
      { $match: { '_id': 1 } }, 
      { $unwind: '$goals' }, 
      { $group: { _id:'player', num_goals: {$sum:1} } }
  )

是否可以将此概念扩展为在同一查询中计算多个Arrays?

谢谢:-)

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你的问题引起了我的兴趣!我决定玩一下,这是可能的!不过还是有点棘手。

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

    这是输出:

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多