汇总数据以按数组的第一个值分组

时间:2019-10-30 18:01:47

标签: mongodb aggregate

假设我的数据库中包含以下数据,并且我希望汇总一些按第一个目标得分值分组的数据。

{
    "_id" : ObjectId("5d7f6a937563a63c1d8b4639"),
    "target" : [
        {
            "score" : 3
        },
    {
            "score" : 2
        }
    ]
},
{
    "_id" : ObjectId("5d7f6a937563a63c1d8b4640"),
    "target" : [
        {
            "score" : 1
        },
    {
            "score" : 4
        }
    ]
}

所以我正在尝试这样做:

data.aggregate(
  [
    {
      $match: { 'target.0.score': { $exists: true } }
    },
    {
      $group: {
        _id: '$target.0.score',
        Datasets: { $sum: 1 }
      }
    }
  ]
)

在我的代码中,我正在做一些平均计算,这就是为什么我使用聚合方法

查询结果为

[ { _id: [], Datasets: 2 } ]

但我希望

[
  { _id: 3, Datasets: 1 },
  { _id: 1, Datasets: 1 }
]

_id应该是包含该得分的所有数据集计数的分组得分值(以及该组的一些平均计算结果)

2 个答案:

答案 0 :(得分:1)

我很确定它已经回答了,但是无论如何:

data.aggregate(
  [
    {
      $match: { 'target.0.score': { $exists: true } }
    },
    {
      $group: {
        _id: {$let:{
            vars: {t0: {$arrayElemAt:["$target", 0]}},
            in: "$$t0.score"
        }},
        Datasets: { $sum: 1 }
      }
    }
  ]
)

答案 1 :(得分:0)

如果要按第一个目标分数分组,则首先需要project对第一个目标分数进行分组,然后按其分组:

data.aggregate(
  [
    {
      $match: { 'target.0.score': { $exists: true } }
    },
    {
      $project: {
        first_target_score: {
          $arrayElemAt: [
            '$target', 0
          ]
        }
      }
    },
    {
      $group: {
        _id: '$first_target_score.score',
        Datasets: { $sum: 1 }
      }
    }
  ]
)

我很确定这是可行的,但是我现在没有办法对其进行测试,请尝试一下