首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在对象数组中按键进行MongoDB数组聚合和分组的问题

在对象数组中按键进行MongoDB数组聚合和分组的问题
EN

Stack Overflow用户
提问于 2021-11-19 17:33:10
回答 1查看 22关注 0票数 0

考虑下面这样的数组,我尝试按日期分组并对持续时间求和:

代码语言:javascript
运行
复制
[
  {
    "allDates": [
      {
        "duration": 153,
        "date": "2021-10"
      },
      {
        "duration": 20,
        "date": "2021-11"
      },
      {
        "duration": 181,
        "date": "2021-11"
      },
      {
        "duration": 180,
        "date": "2021-11"
      }
    ]
  }
]

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

代码语言:javascript
运行
复制
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
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      
    }
  }
])

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

代码语言:javascript
运行
复制
[
  {
    "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
    }
  }
]

所以它是为每个键把它们加起来,而不是为每个键单独加起来,这里我遗漏了什么?

基本上,我希望得到:

代码语言:javascript
运行
复制
...
"durations": {
      "2021-10": 153, 
      "2021-11": 381 
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-19 19:36:56

试试这个:

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70038731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档