【问题标题】:Multiple groups with mongodb aggregate具有 mongodb 聚合的多个组
【发布时间】:2017-08-14 14:49:39
【问题描述】:

我正在尝试对这些数据使用 mongoDb 聚合:

"_id": ObjectId("598dbd301ab6476e5b15e05e"),
"updated_at": ISODate("2017-08-11T14:20:32.865Z"),
"created_at": ISODate("2017-08-11T14:20:32.865Z"),
"action": ObjectId("59760749a398cb323cf1c051"),
"subAction": ObjectId("5980c3807a8cb300110d87d3"),
"person": ObjectId("598dbd2f1ab6476e5b15e05b"),
"session": ObjectId("598dbd2f1ab6476e5b15e05c"),
"dateAccomplish": ISODate("2017-08-11T14:20:32Z"),
"createdBy": ObjectId("595f8426645bf5f47366fb29"),
"updatedBy": ObjectId("595f8426645bf5f47366fb29"),

我想要做的是我需要检索 2 个组。它必须按actionssubactions 分组。

预期的输出数据如下所示:

movactions: [
{
     _id: $created_at,
     count: ?,
     data:[
         {
             _id: "$action",
             count: 3,
             data: [
                {
                    _id: "$subaction",
                    count: 2
                }
             ]
          }
     ]
},
]

有很多子动作都有一个动作,我想将每个动作与列出的子动作聚合起来

【问题讨论】:

标签: javascript mongodb grouping aggregate


【解决方案1】:

要按多个字段分组,$group 应与复合 _id 一起应用多次,并在下一组中逐渐减少:

db.collection.aggregate([
    {$group:{
        _id:{created_at:"$created_at", action:"$action", subAction:"$subAction"},
        count: {$sum:1}
    }},
    {$group:{
        _id:{created_at:"$_id.created_at", action:"$_id.action"},
        count: {$sum:1},
        data: {$push:{_id: "$_id.subAction", count:"$count"}}
    }},
    {$group:{
        _id:"$_id.created_at",
        count: {$sum:1},
        data: {$push:{_id: "$_id.action", count:"$count", data:"$data"}}
    }}, 
    {$project: {
        _id:0,
        created_at:"$_id", 
        count:1, 
        data:1
    }}
]);

【讨论】:

  • 有点像这样,但是我有很多子动作有一个动作,我想在它所属的动作中抓取子动作
  • 嗯,有什么问题吗? dataaction 中应该包含所有subActions 具有共同的created_ataction
  • 他们有不同的created_at 日期。那么你希望_id: $created_at, 分组如何工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多