【问题标题】:Group at two levels with totals in array在两个级别分组,数组中的总数
【发布时间】:2017-08-08 20:18:31
【问题描述】:

目前管道的结果:

[
  {
    catId: 'A1',
    categories: [
      {
         name: 'Monitors',
         section: 99
      },
      {
         name: 'Monitors',
         section: 99
      },
      {
         name: 'Monitors',
         section: 98
      }
    ]
  }
]

我已经将它按猫 ID 分组并使用 $push 来填充类别数组。

我还想对类别数组进行分组

[
  {
     catId: 'A1',
     categories: [
       {
          name: 'Monitors',
          section: 99,
          count: 2
       }
       {
         name: 'Monitors',
         section: 98,
         count: 1
       }
     ]
  }
]

我还没有找到任何关于如何在数组上执行 $group 的示例。

到目前为止我的查询:

let query = mongoose.model('categories').aggregate([
    {
        $group: {
            _id: {catId: '$catId'},
            categories: {$push: {name: "$name", section: "$section"}}
        }
    },
    {
        $project: {
            catId: '$_id.catId',
            categories: 1,
            _id: 0,
        }
    }
]);

【问题讨论】:

  • 请添加您当前的查询
  • 有很多方法,但如果你真的想基于目前现有的聚合来做到这一点,那么最有意义的是向你展示现有的管道和源文档。因为这些方法中“最有效”的方法是在达到这一阶段的结果之前,实际上首先考虑添加这些总数和聚合级别。
  • 用查询更新了问题。

标签: mongodb aggregation-framework


【解决方案1】:

所以,与其做你正在做的事,不如先做另一个$group

let query = mongoose.model('categories').aggregate([
    { $group: {
      _id: { catId: "$catId", name: "$name", section: "$section" },
      count: { $sum: 1 }
    }},
    { $group: {
      _id: '$_id.catId',
      categories: {
        $push: {
          name: "$_id.name",
          section: "$_id.section",
          count: "$count"
        }
      }
    }}
]);

还要习惯将_id 作为输出的主键,因为添加额外的$project 阶段实际上只是在浪费CPU 和I/O。字段名称就是它们的本质,$group 阶段在这方面做得很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多