【问题标题】:Aggregate data to group by first value of an array聚合数据以按数组的第一个值分组
【发布时间】:2020-02-26 02:27:38
【问题描述】:

假设我的数据库中有以下数据,我想聚合一些按第一个目标得分值分组的数据。

{
    "_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 应该是分组的分数值与该分数的所有数据集的计数(以及该组的一些平均计算)

【问题讨论】:

  • 这是一种查找/匹配语法来访问数组中的元素。对于 $group,您需要使用 $arrayElemAt。见stackoverflow.com/questions/39196537/…
  • @AlexBlex 但是$arrayElemAt: ['$target', 0] 给了我对象。我需要得到分数值。
  • ~只用$let,看我的回答~看卢卡斯的回答
  • @AlexBlex 你为什么删除你的答案。它正在工作。卢卡斯的回答没有考虑score 字段。
  • 很公平。我取消了我的删除以显示另一种方法,并更正了卢卡斯的方法以使用score。在这种特殊情况下,额外的阶段更好。 $addFields 而不是 $project 可能更灵活一些。

标签: mongodb aggregate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果要按第一个目标分数分组,首先需要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 }
          }
        }
      ]
    )
    

    我很确定这会起作用,但我现在没有办法测试它,只是试一试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 2016-03-20
      • 2022-01-01
      • 2011-04-11
      • 1970-01-01
      • 2018-03-30
      • 2020-08-07
      相关资源
      最近更新 更多