如何在分组依据中使用多个项目

How to use multiple items in group by

我有这样的数据:

[
    {"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'3'}
    {"createdAt": 2022-02-10T00:00:00.000Z,name:'google',value:'30'}
    {"createdAt": 2022-03-10T00:00:00.000Z,name:'stack',value:'33'}
    {"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'32'}
    {"createdAt": 2022-03-10T00:00:00.000Z,name:'google',value:'31'}
    {"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'13'}
    {"createdAt": 2022-04-10T00:00:00.000Z,name:'stack',value:'23'}
    {"createdAt": 2022-02-10T00:00:00.000Z,name:'google',value:'33'}
    {"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'43'}
    {"createdAt": 2022-03-10T00:00:00.000Z,name:'stack',value:'32'}
    {"createdAt": 2022-02-10T00:00:00.000Z,name:'stack',value:'35'}
    {"createdAt": 2022-04-10T00:00:00.000Z,name:'google',value:'38'}
]

查询

db.collection.aggregate([
    {$group:{_id:{$dayOfYear:"$createdAt",name:"$name"},"total":{$sum:"$value"}}}
])

预期结果:

[
    {name:google,date:2022-02-10:,value:63}
    {name:google,date:2022-03-10:,value:31}
    {name:google,date:2022-04-10:,value:113}
    {name:google,date:2022-02-10:,value:51}
    {name:google,date:2022-03-10:,value:65}
    {name:google,date:2022-04-10:,value:23}
]

我尝试按多个项目分组并收到以下错误:

An object representing an expression must have exactly one field: { $dayOfYear: "$createdAt", name: "$name" }

  1. $set - 使用 date-only 字符串创建 date 字段(通过 $dateToString)。
  2. $group - 按 datename 分组。要将 value 求和为 total,您需要先通过 $int 转换为整数。
  3. $project - 修饰输出文档。
db.collection.aggregate([
  {
    $set: {
      date: {
        "$dateToString": {
          "date": "$createdAt",
          "format": "%Y-%m-%d"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        date: "$date",
        name: "$name"
      },
      "total": {
        $sum: {
          $toInt: "$value"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      date: "$_id.date",
      name: "$_id.name",
      total: "$total"
    }
  }
])

Sample Mongo Playground