Попытка агрегировать по нескольким полям Mongoose - PullRequest
0 голосов
/ 25 октября 2018

Я создал систему ввода времени, в которой пользователи могут вводить количество времени (в процентах), затраченного на задачу между заданным периодом времени.Каждая запись выглядит следующим образом.Я изменил имя пользователя _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"
},

Я пытаюсь сначала сгруппировать по Person, а затем по проекту.По сути, я хочу узнать, сколько каждый пользователь потратил на выполнение определенной задачи.Не уверен, что то, чего я пытаюсь достичь, возможно.Ниже я включил то, что я пытаюсь достичь:

Пример вывода:

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

]

Я пробовал множество способов добиться этого, и я не приблизился.Надеюсь, у кого-то есть понимание того, как этого добиться.

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать несколько групп, одну для суммирования процентов для каждого пользователя и комбинации имя_проекта, а вторую группу для отправки всех документов для пользователя.

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"]]]}}
...