【问题标题】:Issue with MongoDB array aggregation and grouping by key in array of objectsMongoDB数组聚合和按对象数组中的键分组的问题
【发布时间】:2021-11-19 17:33:09
【问题描述】:

考虑一个像下面的数组,我试图按日期分组并对持续时间求和:

[
  {
    "allDates": [
      {
        "duration": 153,
        "date": "2021-10"
      },
      {
        "duration": 20,
        "date": "2021-11"
      },
      {
        "duration": 181,
        "date": "2021-11"
      },
      {
        "duration": 180,
        "date": "2021-11"
      }
    ]
  }
]

我试图获得持续时间的总和,但按日期分组。 这是我迄今为止尝试过的:

db.collection.aggregate([
  {
    $addFields: {
      durations: {
        $arrayToObject: {
          $map: {
            input: "$allDates",
            as: "allDate",
            in: {
              k: {
                $toString: "$$allDate.date"
              },
              v: {
                $sum: {
                  $map: {
                    input: "$allDates",
                    as: "kv",
                    in: {
                      $cond: {
                        if: {
                          $eq: [
                            {
                              $toString: "$allDate.date"
                            },
                            {
                              $toString: "$$kv.k"
                            }
                          ]
                        },
                        then: "$$kv.duration",
                        else: 0
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      
    }
  }
])

不幸的是我得到的结果是:

[
  {
    "allDates": [
      {
        "date": "2021-10",
        "duration": 153
      },
      {
        "date": "2021-11",
        "duration": 20
      },
      {
        "date": "2021-11",
        "duration": 181
      },
      {
        "date": "2021-11",
        "duration": 180
      }
    ],
    "durations": {
      "2021-10": 534,
      "2021-11": 534
    }
  }
]

所以它是为每个键而不是分别为每个键添加它们,我在这里缺少什么?

基本上我希望得到:

...
"durations": {
      "2021-10": 153, 
      "2021-11": 381 
}

【问题讨论】:

  • 您希望得到什么结果?
  • @WernfriedDomscheit "durations": {"2021-10": 153, "2021-11": 381 } 基本上。因此,要添加每个日期的持续时间,而不是全部。编辑了问题以反映这一点。

标签: arrays mongodb mongodb-query aggregate


【解决方案1】:

试试这个:

db.collection.aggregate([
  {
    $unwind: "$allDates"
  },
  {
    $group: {
      _id: "$allDates.date",
      duration: {
        $sum: "$allDates.duration"
      }
    }
  },
  {
    $group: {
      _id: null,
      durations: {
        $push: {
          k: "$_id",
          v: "$duration"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      durations: {
        $arrayToObject: "$durations"
      }
    }
  }
])

Mongo Playground

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多