Группа агрегации конвейера mongodb приводит к массиву - PullRequest
1 голос
/ 10 марта 2020

У меня есть проекты коллекция:

{
  _id: 1,
  title: "Project 1"
},
{
  _id: 2,
  title: "Project 2"
}

и (время) записей коллекция:

{
  _id: 90123,
  project_id: 1,
  task_id: 1,
  hours: 3
},
{
  _id: 90124,
  project_id: 1,
  task_id: 1,
  hours: 5
},
{
  _id: 90125,
  project_id: 2,
  task_id: 2,
  hours: 1
},
{
  _id: 90126,
  project_id: 1,
  task_id: 2,
  hours: 2
}

Я бы нравится использовать агрегацию конвейера для:

  • Получить записи для проекта 1
  • Суммировать все записи для проекта 1 как "totalSpent"
  • Группировать по task_id с суммированными часами за задачу

Примерно так: конечный результат:

{
  totalSpent: 10,
  spentByTask: {
    { task_id: 1, spent: 8 },
    { task_id: 2, spent: 2 }
  }
}

1 Ответ

2 голосов
/ 10 марта 2020

попробуйте этот конвейер:

db.entries.aggregate(
    [
        {
            $match: { project_id: 1 }
        },
        {
            $group: {
                _id: '$task_id',
                spent: { $sum: '$hours' }
            }
        },
        {
            $group: {
                _id: null,
                totalSpent: { $sum: '$spent' },
                spentByTask: { $push: { task_id: '$_id', spent: '$spent' }
                }
            }
        },
        {
            $project: { _id: 0 }
        }
    ])

, если вам нужен другой результат, дайте мне знать, и я соответствующим образом обновлю свой ответ.

...