聚合数据以按数组的第一个值分组

Posted

技术标签:

【中文标题】聚合数据以按数组的第一个值分组【英文标题】: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。见***.com/questions/39196537/… @AlexBlex 但是$arrayElemAt: ['$target', 0] 给了我对象。我需要得到分数值。 ~只用$let,看我的回答~看卢卡斯的回答 @AlexBlex 你为什么删除你的答案。它正在工作。卢卡斯的回答没有考虑score 字段。 很公平。我取消了我的删除以显示另一种方法,并更正了卢卡斯的方法以使用score。在这种特殊情况下,额外的阶段更好。 $addFields 而不是 $project 可能更灵活一些。 【参考方案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 
      
    
  ]
)

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

【讨论】:

以上是关于聚合数据以按数组的第一个值分组的主要内容,如果未能解决你的问题,请参考以下文章

Datastore 存储聚合嵌套数据以更好地查询的最佳方式

MongoDB按聚合查询分组

同时从四个表中获取按日期分组的聚合值

按聚合对范围内的缺失值进行分组

LINQ 按时间段聚合和分组

MySQL:JSON 列值聚合到按属性分组的单个 JSON 对象中