【问题标题】:MongoDB aggregate fields without knowing all the fields before handMongoDB在事先不知道所有字段的情况下聚合字段
【发布时间】:2019-06-17 23:37:21
【问题描述】:

如何在事先不知道所有指标的情况下计算以下指标的汇总?我可以使用聚合框架或 MapReduce 来完成此任务吗?

[
  {
   player_id: '123',
   timestamp: <sometime>,
   metrics: {
     points_per_game: 1,
     rebounds_per_game: 2,
     assist_per_game: 3,
   }
  },
  {
    player_id: '123',
    timestamp: <sometime>,
    metrics: {
      points_per_game: 1,
      rebounds_per_game: 2,
    }
  },
  {
    player_id: '345',
    timestamp: <sometime>,
    metrics: {
      points_per_game: 1,
      rebounds_per_game: 2,
      point_in_the_paint_per_game: 2
    }
  }
]

我希望得到以下结果

[
 {
   player_id: '123',
   metrics: {
     points_per_game: 2,
     rebounds_per_game: 4,
     assist_per_game: 3,
   }
 },
 {
   player_id: '345',
   metrics: {
     points_per_game: 1,
     rebounds_per_game: 2,
     point_in_the_paint_per_game: 2
   }
 }
]

我无法执行以下操作,因为这需要我了解每个指标:

db.stats.aggregate([
   {$group: {
     _id: {player: "$player_id"},
     points_per_game: { $sum: "$metrics.points_per_game"}
     ...
])

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以尝试以下聚合。

    将对象转换为键值对数组,后跟 $unwind+$group 以按每个键分组并累积计数。最后一步,返回命名键值对象。

    db.colname.aggregate([
      {"$addFields":{"metrics":{"$objectToArray":"$metrics"}}},
      {"$unwind":"$metrics"},
      {"$group":{
        "_id":{"id":"$player_id","key":"$metrics.k"},
        "count":{"$sum":"$metrics.v"}
      }},
      {"$group":{
        "_id":"$_id.id",
        "metrics":{"$mergeObjects":{"$arrayToObject":[[["$_id.key","$count"]]]}}
      }}
    ])
    

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多