【问题标题】:Mongodb aggregation : how to merge two different groupsMongodb聚合:如何合并两个不同的组
【发布时间】:2021-03-04 06:11:37
【问题描述】:

尝试获取每个用户的各种状态的计数和过期项目的计数。 以下是示例文档:

[{
  _id:"12324332432",
  caseInd:"TASK123",
  TaskId:"12345",
  dueDate:ISODate("2021-03-22T00:00:00Z"),
  assingee:"ABC",
  status:"IN_PROGRESS",
  completionDate:null
},
{
  _id:"12324332433",
  caseInd:"TASK124",
  TaskId:"12345",
  dueDate:ISODate("2021-03-01T00:00:00Z"),
  assingee:"CDE",
  status:"IN_PROGRESS",
  completionDate:null
},
{
  _id:"12324332434",
  caseInd:"TASK125",
  TaskId:"12345",
  dueDate:ISODate("2021-03-31T00:00:00Z"),
  assingee:"ABC",
  status:"COMPLETED",
  completionDate:ISODate("2021-03-01T00:00:00Z")
}...]

使用聚合,我想获取每个用户的任务数(已完成、进行中和过期)。 喜欢

[{
  _id : ABC , 
  data: [
      {status:"Completed", count:15},
      {status:"InProgress", count:3},
      {status:"Overdue", count:3}] 
  },{
  _id : CDE, 
  data: [
      {status:"Completed", count:5},
      {status:"InProgress", count:1},
      {status:"Overdue", count:0}] 
  }]

我已经厌倦了这个解决方案,但不确定如何包括过期计数。

db.colName.aggregate([ {$project: {_id:0, 
            dueDateIn:{$divide:[{$subtract:[new Date(),$dueDate]},86400000]},
            status:1,
            assignee:1
          }
    }, {
    $group:{
        _id:{"assignee":"$assignee", "status":"$status"},
        count:{$sum:1}
    },
    $group:{
        _id:"$_id.assignee" , result:{$push:{"status":"$_id.status", count:"$count"}}
    }
}]) ```

Any help would be highly appreciated. Thank you.

【问题讨论】:

    标签: mongodb aggregation


    【解决方案1】:

    看看 $group 管道中的自定义 $accumulator。

    将带有_id字段的文档分组后,您可以使用自定义累加器来统计状态。

    $组 https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

    $累加器 https://docs.mongodb.com/manual/reference/operator/aggregation/accumulator/#grp._S_accumulator

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      相关资源
      最近更新 更多