【问题标题】:Trying to aggregate on multiple fields Mongoose试图聚合多个字段 Mongoose
【发布时间】:2019-03-30 01:28:02
【问题描述】:

我创建了一个时间输入系统,用户可以在其中输入在给定时间段之间花费在任务上的时间量(百分比)。每条记录如下所示。我将用户 _id 更改为显式名称,以使其更易于可视化

"project_name": "first_project",
"linked_project": "5bd057f5d4b8173d88b7fe47",
"percentage": 25,
"user": {
    "$oid": "Steve"
},

"project_name": "first_project",
"linked_project": "5bd057f5d4b8173d88b7fe47",
"percentage": 50,
"user": {
    "$oid": "Steve"
},

"project_name": "second_project",
"linked_project": "5bd057f5d4b8173d88b7fe48",
"percentage": 25,
"user": {
    "$oid": "Steve"
},

"project_name": "second_project",
"linked_project": "5bd057f5d4b8173d88b7fe48",
"percentage": 75,
"user": {
    "$oid": "Mary"
},

我尝试先按人分组,然后按项目分组。基本上,我想知道每个用户在特定任务上花费了多少。不确定我想要实现的目标是否可行。我在下面包含了我想要实现的目标:

示例输出:

[
    {
        user: Steve,
        projects: [
            first_project: 75,
            second_project: 25
        ]
    },
    {
        user: Mary,
        projects: [
            second_project: 75
        ]
    }

]

我尝试了多种方法来实现这一目标,但都没有成功。希望有人对如何实现这一点有所了解。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework aggregate


    【解决方案1】:

    您可以使用多个组,一个用于汇总每个用户和 project_name 组合的百分比,第二个组用于推送用户的所有文档。

    db.colname.aggregate([
      {"$group":{
        "_id":{
          "user":"$user",
          "project_name":"$project_name"
        },
        "time":{"$sum":"$percentage"}
      }},
      {"$group":{
        "_id":"$_id.user",
        "projects":{"$push":{"project_name":"$_id.project_name","time":"$time"}}
      }}
    ])
    

    要将输出作为单个文档,您可以在最后一个小组阶段使用

    "projects":{"$mergeObjects":{"$arrayToObject":[[["$_id.project_name","$time"]]]}}
    

    【讨论】:

    • 如何添加排序,以便项目数组按名称排序?
    • 小组赛前添加{$sort:{"_id.project_name":1}}
    猜你喜欢
    • 2021-07-21
    • 2021-09-17
    • 2023-03-14
    • 2012-09-28
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多