【问题标题】:mongo aggregation - accumulate for different groups of values of a fieldmongo 聚合 - 为字段的不同值组累积
【发布时间】:2016-09-14 15:43:57
【问题描述】:

如果我有Player表格的文件

{name: String, score: Int}

我有 Group 文档,其中组代表玩家列表

{groupName: String, players: [ObjectID]}

玩家可以属于多个组。

我想对 Player 文档进行聚合,按 Group 分组(例如,通过一个聚合管道获取每个组的玩家得分总和)。

我知道的选项:

=> 将Player docs 反向指针指向与它们关联的Group 文档,然后将$group 指向GroupID。但我宁愿不必修改Player 集合。 (也许有一种方法可以在管道期间将GroupIDs “添加”到文档中?)

=> 为每个组单独调用并使用$match 阶段过滤到当前组中被查询的玩家。但我更喜欢打一个简单的电话。

我怎样才能实现这样的聚合? MongoDB 聚合是否有适用于此的东西?

(顺便说一句,将组和玩家相互映射到进行调用的内存中并不是问题。因此,将玩家列表作为参数传递的选项确实是公平的游戏。)

【问题讨论】:

    标签: javascript mongodb meteor aggregation-framework


    【解决方案1】:

    除了@Chridam 的回答,为了避免混淆集合/字段/展开别名,我建议这样做:

    db.Group.aggregate( [
      {$unwind:"$players"}, 
      {$lookup: {
        from:"Player",
        localField:"players",
        foreignField:"_id",
        as:"P" }
      },
      {$unwind:"$P"},
      {"$group":{ 
        total: {$sum:"$P.score"}, 
        _id:"$_id"
      }}  
    ])
    

    【讨论】:

      【解决方案2】:

      您可以为此使用 $lookup 运算符。考虑运行以下聚合管道:

      Mongo shell:

      db.group.aggregate([
          { "$unwind": "$players" },
          {
              "$lookup": {
                  "from": "players",
                  "localField": "players",
                  "foreignField": "_id",
                  "as": "players_join"
              }
          },
          { "$unwind": "$players_join" },
          {
              "$group": {
                  "_id": {
                      "groupName": "$groupName",
                      "name": "$players_join.name"
                  },
                  "totalScore": { "$sum": "$players_join.score" }
              }
          }
      ])
      

      您可以通过获取为您包装了一些 Mongo 方法的聚合框架包来添加对聚合的支持。只需添加流星 meteorhacks:aggregate,您就可以开展业务了。这将为 Meteor 中的集合添加一个聚合方法。

      【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2019-03-25
      • 2016-07-28
      • 1970-01-01
      • 2018-06-05
      • 2020-04-19
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多